#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node {
int val,size;
struct Node* left, * right;
}Node;
Node __NIL;
#define NIL (&__NIL)
#define INITIALIZER(f) \
static void init_NIL(void) __attribute__((constructor));\;
void init_NIL() {
NIL->val = 0;
NIL->size = 0;
NIL->left =NIL->right = NIL;
}
void update_size(Node* root) {
root->size = root->left->size + root->right->size + 1;
return;
}
Node* get_newNode(int key) {
Node* p = (Node*)malloc(sizeof(Node));
p->left = p->right = NIL;
p->val = key;
p->size = 0;
return p;
}
Node* insert(Node* root, int target) {
if (root == NIL)return get_newNode(target);
if (root->val == target)return root;
if (root->val > target)root->left = insert(root->left, target);
else root->right = insert(root->right, target);
update_size(root);
return root;
}
void clear(Node* root) {
if (root == NIL)return;
clear(root->left);
clear(root->right);
clear(root);
return;
}
int search(Node* root, int target) {
if (root == NIL)return 0;
if (root->val == target)return 1;
if (root->val > target)return search(root->left, target);
else return search(root->right, target);
}
Node* predecessor(Node* root) {
Node* p = root->left;
while (p != NIL && p->right != NIL)
p = p->right;
return p;
}
Node* erase(Node* root, int target) {
if (root == NIL)return root;
if (root->val > target)
root->left = erase(root->left, target);
else if (root->val < target)
root->right = erase(root->right, target);
else {
if (root->right == NIL || root->left == NIL) {
Node* tmp = root->left != NIL ? root->left : root->right;
free(root);
return tmp;
}
else {
Node* tmp = predecessor(root);
root->val = tmp->val;
root->left = erase(root->left, tmp->val);
}
}
update_size(root);
return root;
}
void in_order(Node* root) {
if (root == NIL)return;
in_order(root->left);
printf("%d ", root->val);
in_order(root->right);
return;
}
int find_k(Node* root, int k) {
if (root->right->size >= k)
return find_k(root->right, k);
if (root->right->size + 1 == k)
return root->val;
return find_k(root->left, k - root->right->size - 1);
}
int main() {
Node* root = NIL;
srand(time(0));
int n;
scanf_s("%d",
for (int i = 0; i < n; i++) {
int num = rand() % 100;
printf("%d ", num);
root = insert(root, num);
}
printf("\n");
in_order(root);
while (~scanf_s("%d", &n)) {
printf("find_k(Node* root,%d) = %d\n", n, find_k(root, n));
}
return 0;
}