#include #define TREE_SIZE 65536 struct TreeNode { int val; int left; int right; }; TreeNode tree[TREE_SIZE] = {0}; int num_in_tree[TREE_SIZE] = {0}; int num_in_tree_head = 0, num_in_tree_tail = 0; int tree_root = -1; // int new_tree_node = 0; int M, K, H; long long total = 0; int l = 0; int enqueue(int num) { num_in_tree[num_in_tree_tail] = num; num_in_tree_tail = (num_in_tree_tail + 1) % TREE_SIZE; return 0; } int dequeue() { int ans = num_in_tree[num_in_tree_head]; num_in_tree_head = (num_in_tree_head + 1) % TREE_SIZE; return ans; } int insert_node(int num, int pos) { if (pos < 0) { // The tree_root is -1! tree[l % K] = TreeNode{num, 1, -1, -1}; tree_root = l % K; // new_tree_node = (new_tree_node + 1) % TREE_SIZE; return 0; } // tree[pos].size++; if (tree[pos].val > num) { if (tree[pos].left < 0) { tree[pos].left = l % K; tree[l % K] = TreeNode{num, 1, -1, -1}; // new_tree_node = (new_tree_node + 1) % TREE_SIZE; return 0; } else { insert_node(num, tree[pos].left); return 0; } } else { if (tree[pos].right < 0) { tree[pos].right = l % K; tree[l % K] = TreeNode{num, 1, -1, -1}; // new_tree_node = (new_tree_node + 1) % TREE_SIZE; return 0; } else { insert_node(num, tree[pos].right); return 0; } } } int delete_node(int num, int pos) { if (pos < 0) { return -1; } if (tree[pos].val < num) { // tree[pos].size--; tree[pos].right = delete_node(num, tree[pos].right); return pos; } if (tree[pos].val > num) { // tree[pos].size--; tree[pos].left = delete_node(num, tree[pos].left); return pos; } // If reached here, tree[pos].val == num, so we are going to delete tree[pos] if (tree[pos].left < 0) { // The case when left is null, right is something // and also the case when both left and right is null return tree[pos].right; } if (tree[pos].right < 0) { // The case when left is something while right is null return tree[pos].left; } // Here, we deal with the case that both children exist. int parent = pos; int child = tree[parent].right; // tree[parent].size--; while (tree[child].left >= 0) { parent = child; child = tree[child].left; // tree[parent].size--; } if (parent == pos) { tree[parent].right = tree[child].right; } else { tree[parent].left = tree[child].right; } // tree[pos].val = tree[child].val; // return pos; tree[child].left = tree[pos].left; tree[child].right = tree[pos].right; tree[child].size = tree[pos].size; return child; } int traverse(int pos) { if (pos < 0) { return 0; } printf("%d(", tree[pos].val); if (tree[pos].left >= 0) { printf("l%d:", tree[pos].val); traverse(tree[pos].left); } if (tree[pos].right >= 0) { printf("r%d:", tree[pos].val); traverse(tree[pos].right); } printf(")"); fflush(stdout); // if (pos < 0) { // return 0; // } // traverse(tree[pos].left); // printf("%d ", tree[pos].val); // traverse(tree[pos].right); return 0; } int get_size(int pos) { if (pos < 0) { return 0; } return 1 + get_size(tree[pos].left) + get_size(tree[pos].right); } int count_less_than(long long target, int pos) { if (pos < 0) { return 0; } if (tree[pos].val < target) { // if (tree[pos].left < 0) { // return 1 + count_less_than(target, tree[pos].right); // } // return tree[tree[pos].left].size + 1 + count_less_than(target, tree[pos].right); return get_size(tree[pos].left) + 1 + count_less_than(target, tree[pos].right); } if (tree[pos].val > target) { return count_less_than(target, tree[pos].left); } // tree[pos].val == target // if (tree[pos].left < 0) { // return 1; // } return 1 + get_size(tree[pos].left); } int main() { scanf("%d %d %d", &M, &K, &H); int num = 0; for (l = 0; l < M; l++) { scanf("%d", &num); // printf("num: %d, %d %d\n\n", num, count_less_than(num + H, tree_root), // printf("num: %d, %d %d\n", num, count_less_than(((long long)num) + H, tree_root), count_less_than(num - H - 1, tree_root)); // printf("num: %d, ", num); // printf("%d ", count_less_than(((long long)num) + H, tree_root)); // printf("%d\n", count_less_than(num - H - 1, tree_root)); total += count_less_than(((long long)num) + H, tree_root) - count_less_than(num - H - 1, tree_root); if (l >= K) { tree_root = delete_node(dequeue(), tree_root); // traverse(tree_root); // printf("\n"); } enqueue(num); insert_node(num, tree_root); // traverse(tree_root); // printf("\n"); } printf("%lld\n", total); // int count = 0; // int num = 0; // scanf("%d", &count); // for (int i = 0; i < count; i++) { // scanf("%d", &num); // insert_node(num, tree_root); // } // for (int i = 0; i < count; i++) { // printf("%d ", count_less_than(i, tree_root)); // } return 0; }