一、平衡树
1、treap树
1 int key[MAXN], weight[MAXN], child[MAXN][2], size[MAXN]; 2 int stk[MAXN], top, poi_cnt;//not use point 3 4 inline int newNode(int k) { 5 int x = (top ? stk[top--] : ++poi_cnt); 6 key[x] = k; 7 size[x] = 1; 8 weight[x] = rand(); 9 child[x][0] = child[x][1] = 0; 10 return x; 11 } 12 13 inline void update(int &x) { 14 size[x] = size[child[x][0]] + size[child[x][1]] + 1;//size[0]=0 15 } 16 17 inline void rotate(int &x, int t) { 18 int y = child[x][t]; 19 child[x][t] = child[y][t ^ 1]; 20 child[y][t ^ 1] = x; 21 update(x); update(y); 22 x = y; 23 } 24 25 void insert(int &x, int k) { 26 if (x == 0) x = newNode(k); 27 else { 28 int t = (key[x] < k); 29 insert(child[x][t], k); 30 if (weight[child[x][t]] < weight[x]) rotate(x, t); 31 } 32 update(x); 33 } 34 35 void remove(int &x, int k) { 36 if(key[x] == k) { 37 if(child[x][0] && child[x][1]) { 38 int t = weight[child[x][0]] < weight[child[x][1]]; 39 rotate(x, t); remove(child[x][t ^ 1], k); 40 } 41 else { 42 stk[++top] = x; 43 x = child[x][0] + child[x][1]; 44 } 45 } 46 else remove(child[x][key[x] < k], k); 47 if(x > 0) update(x); 48 } 49 50 int kth(int &x, int k) { 51 if(x == 0 || k <= 0 || k > size[x]) return 0; 52 int s = 0; 53 if(child[x][1]) s = size[child[x][1]]; 54 if(k == s + 1) return key[x]; 55 if(k <= s) return kth(child[x][1], k); 56 return kth(child[x][0], k - s - 1); 57 }