1 splay
1 void rotate(int o, int kind) {
2 int p = pre[o];
3 ch[p][!kind] = ch[o][kind], pre[ch[o][kind]] = p;
4 ch[pre[p]][ch[pre[p]][1] == p] = o, pre[o] = pre[p];
5 ch[o][kind] = p, pre[p] = o;
6 }
7 void splay(int o, int goal) {
8 while (pre[o] != goal) {
9 if (pre[pre[o]] == goal) rotate(o, ch[pre[o]][0] == o);
10 else {
11 int p = pre[o], kind = ch[pre[p]][0] == p;
12 if (ch[p][kind] == o) rotate(o, !kind), rotate(o, kind);
13 else rotate(p, kind), rotate(o, kind);
14 }
15 }
16 if (goal == 0) root = o;
17 }
2 Treap
1 void rotate(int &o, int kind) {
2 int x = ch[o][!kind];
3 ch[o][!kind] = ch[x][kind];
4 ch[x][kind] = o;
5 o = x;
6 }
3 fhq_Treap
1 void split(int o, int keyy, int &x, int &y) {
2 if (!o) x = y = 0;
3 else {
4 if (key[o] <= keyy) x = o, split(ch[o][1], keyy, ch[o][1], y);
5 else y = o, split(ch[o][0], keyy, x, ch[o][0]);
6 }
7 }
8 int merge(int x, int y) {
9 if (!x || !y) return x+y;
10 if (lev[x] < lev[y]) {
11 ch[x][1] = merge(ch[x][1], y);
12 return x;
13 }else {
14 ch[y][0] = merge(x, ch[y][0]);
15 return y;
16 }
17 }
4 LCT
1 void rotate(int o, int kind) {
2 int p = pre[o];
3 ch[p][!kind] = ch[o][kind], pre[ch[o][kind]] = p;
4 if (isrt[p]) isrt[o] = 1, isrt[p] = 0;
5 else ch[pre[p]][ch[pre[p]][1] == p] = o;
6 pre[o] = pre[p];
7 ch[o][kind] = p, pre[p] = o;
8 }
9 void splay(int o) {
10 push(o);
11 while (!isrt[o]) {
12 if (isrt[pre[o]]) rotate(o, ch[pre[o]][0] == o);
13 else {
14 int p = pre[o], kind = ch[pre[p]][0] == p;
15 if (ch[p][kind] == o) rotate(o, !kind), rotate(o, kind);
16 else rotate(p, kind), rotate(o, kind);
17 }
18 }
19 }
20 void access(int o) {
21 int y = 0;
22 while (o) {
23 splay(o);
24 isrt[ch[o][1]] = 1, isrt[ch[o][1] = y] = 0;
25 o = pre[y = o];
26 }
27 }
28 void makeroot(int o) {
29 access(o), splay(o);
30 rev[o] ^= 1, swap(ch[o][0], ch[o][1]);
31 }
32 void link(int x, int y) {
33 makeroot(x); pre[x] = y;
34 }
35 void cut(int x, int y) {
36 makeroot(x), access(y), splay(y);
37 ch[y][0] = pre[x] = 0, isrt[x] = 1;
38 }
5 左偏树
1 int merge(int a, int b) {
2 if (!a || !b) return a+b;
3 if (key[a] > key[b]) swap(a, b);
4 ch[a][1] = merge(ch[a][1], b);
5 if (dist[ch[a][0]] < dist[ch[a][1]]) swap(ch[a][0], ch[a][1]);
6 dist[a] = dist[ch[a][1]]+1;
7 return a;
8 }