模板汇总——splay
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #define lch(x) tr[x].son[0] 2 #define rch(x) tr[x].son[1] 3 const int N = 1e5 + 100; 4 int tot = 0, root; 5 struct Node{ 6 int son[2], pre, sz; 7 void init(){ 8 sz = 1; 9 son[0] = son[1] = pre = 0; 10 } 11 }tr[N]; 12 13 void Push_Rev(int x){ 14 if(!x) return ; 15 swap(lch(x), rch(x)); 16 tr[x].rev ^= 1; 17 } 18 void Push_up(int x){ 19 if(!x) return; 20 tr[x].sz = tr[lch(x)].sz + tr[rch(x)].sz + 1; 21 } 22 23 void Push_Down(int x){ 24 if(tr[x].rev){ 25 tr[x].rev = 0; 26 Push_Rev(lch(x)); 27 Push_Rev(rch(x)); 28 } 29 } 30 31 void Reverse(int l, int r){ 32 int pl = Find(l, root); 33 int pr = Find(r+2, root); 34 Splay(pl, 0); 35 Splay(pr, pl); 36 Push_Rev(tr[pr].son[0]); 37 Push_Up(tr[pr].son[0]); 38 Push_Up(pr); 39 Push_Up(pl); 40 } 41 42 int build(int ll, int rr){ 43 int p = 0, x; 44 for(int i = rr; i >= ll; i--){ 45 x = ++tot; 46 tr[x].init(); 47 tr[x].son[1] = p; 48 tr[p].pre = x; 49 Push_Up(x); 50 p = x; 51 } 52 return x; 53 } 54 55 void rotate(int x){ 56 int y = tr[x].pre; 57 int z = tr[y].pre; 58 int k = x == rch(y); 59 tr[x].pre = z; 60 tr[z].son[y == rch(z)] = x; 61 tr[y].son[k] = tr[x].son[k^1]; 62 tr[tr[y].son[k]].pre = y; 63 tr[x].son[k^1] = y; 64 tr[y].pre = x; 65 Push_up(y); 66 } 67 68 void splay(int x, int goal){ 69 while(tr[x].pre != goal){ 70 int y = tr[x].pre; 71 int z = tr[y].pre; 72 if(z != goal){ 73 if((lch(y) == x) ^ (lch(z) == y)) rotate(x); ///x和y分别是y和z的同一段的儿子 74 else rotate(y); 75 } 76 rotate(x); 77 } 78 if(!goal) root = x; 79 Push_up(x); 80 } 81 int Find(int num, int x){ 82 Push_Down(x); 83 if(num == tr[lch(x)].sz + 1) return x; 84 if(num <= tr[lch(x)].sz) return Find(num, lch(x)); 85 return Find(num - tr[lch(x)].sz - 1, rch(x)); 86 } 87 void Insert_point(LL v, LL z){ 88 int p = root, ff = 0; 89 while(p && tr[p].val != v){ 90 ff = p; 91 p = tr[p].son[ tr[p].val < v]; 92 } 93 if(p){ 94 tr[p].szz += z; 95 } 96 else { 97 p = ++tot; 98 if(ff) tr[ff].son[ tr[ff].val < v] = p; 99 tr[p].init(v, z); 100 tr[p].pre = ff; 101 } 102 splay(p, 0); 103 } 104 105 void Collect(int x){ 106 if(tr[x].son[0]) Clear(tr[x].son[0]); 107 if(tr[x].son[1]) Clear(tr[x].son[1]); 108 sta[++top] = x; 109 } 110 void Delete_tree(int l, int r){ 111 int pl = Find(l, root); 112 int pr = Find(r+2, root); 113 Splay(pl, 0); 114 Splay(pr, pl); 115 Collect(tr[pr].son[0]); 116 tr[pr].son[0] = 0; 117 Push_Up(pr); 118 Push_Up(pl); 119 } 120 121 void dfs(int x){ 122 Push_down(x); 123 if(lch(x)) dfs(lch(x)); 124 printf("%d ", tr[x].val); 125 if(rch(x)) dfs(rch(x)); 126 }