1 struct treap_node {
2 treap_node *left, *right;
3 int value, fix, size;
4 };
5
6 void treap_maintain(treap_node* a) {
7 a->size = 1;
8 if(a->left != NULL) a->size += a->left->size;
9 if(a->right != NULL) a->size += a->right->size;
10 }
11
12 void treap_left_rotate(treap_node *&a) {
13 treap_node *b = a->right;
14 a->right = b->left;
15 b->left = a;
16 a = b;
17 treap_maintain(a->left);
18 treap_maintain(a);
19 }
20
21 void treap_right_rotate(treap_node *&a) {
22 treap_node *b = a->left;
23 a->left = b->right;
24 b->right = a;
25 a = b;
26 treap_maintain(a->right);
27 treap_maintain(a);
28 }
29
30 void treap_insert(treap_node *&a, int value) {
31 if(a == NULL) {
32 a = new treap_node;
33 a->value = value;
34 a->fix = rand();
35 a->left = a->right = NULL;
36 } else if(value < a->value) {
37 treap_insert(a->left, value);
38 if(a->left->fix < a->fix) treap_right_rotate(a);
39 } else {
40 treap_insert(a->right, value);
41 if(a->right->fix < a->fix) treap_left_rotate(a);
42 }
43 treap_maintain(a);
44 }
45
46 void treap_delete(treap_node *&a, int value) {
47 if(value == a->value) {
48 if(!a->left || !a->right) {
49 treap_node *t = a;
50 if(!a->left) a = a->right;
51 else a = a->left;
52 delete t;
53 } else {
54 if(a->left->fix < a->right->fix) {
55 treap_right_rotate(a);
56 treap_delete(a->right, value);
57 } else {
58 treap_left_rotate(a);
59 treap_delete(a->left, value);
60 }
61 }
62 } else {
63 if(value < a->value) treap_delete(a->left, value);
64 else treap_delete(a->right, value);
65 }
66 if(a != NULL) treap_maintain(a);
67 }
68
69 bool treap_find(treap_node* a, int value) {
70 if(a == NULL) return 0;
71 if(a->value == value) return 1;
72 if(a->value < value) {
73 return treap_find(a->right, value);
74 } else {
75 return treap_find(a->left, value);
76 }
77 }
78
79 int treap_findKth(treap_node* a, int k) {
80 if(a == NULL) return -1;
81 if(k < 0 || k > a->size) return -1;
82 if(a->left == NULL) {
83 if(k == 1) return a->value;
84 else return treap_findKth(a->right, k-1);
85 }
86 if(a->left->size == k-1) {
87 return a->value;
88 }
89 if(a->left->size < k-1) {
90 return treap_findKth(a->right, k-1 - a->left->size);
91 } else {
92 return treap_findKth(a->left, k);
93 }
94 }
95
96 int treap_rank(treap_node* a, int value) {
97 if(a == NULL) return -INF;
98 if(a->value == value) {
99 if(a->left == NULL) return 1;
100 return a->left->size + 1;
101 }
102 if(a->value < value) {
103 int cnt = 0;
104 if(a->left == NULL) cnt = 0;
105 else cnt = a->left->size;
106 return treap_rank(a->right, value) + cnt + 1;
107 } else {
108 return treap_rank(a->left, value);
109 }
110 }