#include #define TREE_SIZE 65535 #define NOTHING 65535 struct TreeNode { int val; int size; unsigned short left; unsigned short 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 = NOTHING; int new_tree_node = 0; int M, K, H; long long total = 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 >= NOTHING) { // The tree_root is -1! tree[new_tree_node] = TreeNode{num, 1, NOTHING, NOTHING}; tree_root = new_tree_node; new_tree_node = (new_tree_node + 1) % TREE_SIZE; return 0; } tree[pos].size++; if (tree[pos].val > num) { if (tree[pos].left >= NOTHING) { tree[pos].left = new_tree_node; tree[new_tree_node] = TreeNode{num, 1, NOTHING, NOTHING}; 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 >= NOTHING ) { tree[pos].right = new_tree_node; tree[new_tree_node] = TreeNode{num, 1, NOTHING, NOTHING}; 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 >= NOTHING) { 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 >= NOTHING) { // 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 >= NOTHING) { // 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 < NOTHING) { 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; } int traverse(int pos) { // printf("%d %d(", tree[pos].val, tree[pos].size); // 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(")"); if (pos < 0) { return 0; } traverse(tree[pos].left); printf("%d ", tree[pos].val); traverse(tree[pos].right); return 0; } int count_less_than(long long target, int pos) { if (pos >= NOTHING) { return 0; } if (tree[pos].val < target) { if (tree[pos].left >= NOTHING) { return 1 + count_less_than(target, tree[pos].right); } return tree[tree[pos].left].size + 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 >= NOTHING) { return 1; } return 1 + tree[tree[pos].left].size; } int main() { scanf("%d %d %d", &M, &K, &H); int num = 0; for (int i = 0; i < M; i++) { scanf("%d", &num); // traverse(tree_root); // printf("\n"); // printf("num: %d, %d %d\n\n", num, count_less_than(num + H, tree_root), // if (i) { // total += count_less_than(num + H, tree_root) - 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 (i >= K) { tree_root = delete_node(dequeue(), tree_root); } enqueue(num); insert_node(num, tree_root); } 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; }