BZOJ1251 序列终结者- splay
愉悦身心的splay
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rd read() 5 #define ll long long 6 using namespace std; 7 8 const int N = 1e5; 9 const ll inf = 1e18; 10 11 int ch[N][2], f[N], size[N], rt, add[N], tn[N], tot; 12 int n, q; 13 ll key[N], MAX[N]; 14 15 int read() { 16 int X = 0, p = 1; char c = getchar(); 17 for(; c > '9' || c < '0'; c = getchar()) if(c == '-') p = -1; 18 for(; c >= '0' && c <= '9'; c = getchar()) X = X * 10 + c - '0'; 19 return X * p; 20 } 21 22 void update(int nd) { 23 int lson = ch[nd][0], rson = ch[nd][1]; 24 size[nd] = size[ch[nd][0]] + size[ch[nd][1]] + 1; 25 MAX[nd] = key[nd]; 26 if(lson) MAX[nd] = max(MAX[nd], MAX[ch[nd][0]]); 27 if(rson) MAX[nd] = max(MAX[nd], MAX[ch[nd][1]]); 28 } 29 30 void pushdown(int nd) { 31 int lson = ch[nd][0], rson = ch[nd][1]; 32 if(tn[nd]) { 33 swap(ch[nd][0], ch[nd][1]); 34 if(ch[nd][0]) tn[ch[nd][0]] ^= 1; 35 if(ch[nd][1]) tn[ch[nd][1]] ^= 1; 36 tn[nd] = 0; 37 } 38 if(add[nd]) { 39 if(lson) key[lson] += add[nd], MAX[lson] += add[nd]; 40 if(rson) key[rson] += add[nd], MAX[rson] += add[nd]; 41 if(lson) add[lson] += add[nd]; 42 if(rson) add[rson] += add[nd]; 43 add[nd] = 0; 44 } 45 } 46 47 int get(int x) { 48 pushdown(f[x]); 49 return x == ch[f[x]][1]; 50 } 51 52 void rotate(int x) { 53 int old = f[x], oldf = f[old], son = ch[x][get(x) ^ 1]; 54 pushdown(old); pushdown(x); 55 if(oldf) ch[oldf][get(old)] = x; 56 ch[x][get(x) ^ 1] = old; 57 ch[old][get(x)] = son; 58 f[old] = x; f[x] = oldf; f[son] = old; 59 update(old); update(x); 60 } 61 62 void splay(int x, int d) { 63 for(int fa; (fa = f[x]) != d; rotate(x)) 64 if(f[fa] != d ) rotate( get(fa) == get(x) ? fa : x); 65 if(!d) rt = x; 66 } 67 68 int build(int l, int r, int fa) { 69 if(l > r) return 0; 70 int mid = ( l + r ) >> 1, now = ++tot; 71 MAX[now] = key[now] = 0; 72 f[now] =fa; 73 ch[now][0] = build(l, mid - 1, now); 74 ch[now][1] = build(mid + 1, r, now); 75 update(now); 76 return now; 77 } 78 79 void init() { 80 rt = ++tot; 81 int rson = ++tot; 82 ch[rt][1] = rson; 83 f[rson] = rt; 84 ch[rson][0] = build(1, n, rson); 85 update(rson); update(rt); 86 } 87 88 int find_k(int k) { 89 int now = rt; 90 for(; ;) { 91 pushdown(now); 92 if(ch[now][0] && k <= size[ch[now][0]]) {now = ch[now][0]; continue;} 93 if(k == size[ch[now][0]] + 1) return now; 94 k -= size[ch[now][0]] + 1; 95 now = ch[now][1]; 96 } 97 } 98 99 void cg_ad(int l, int r, int d) { 100 int pr = find_k(l - 1), nx = find_k(r + 1), lson; 101 splay(pr, 0); splay(nx, pr); 102 add[lson = ch[nx][0]] += d; 103 key[lson] += d; 104 MAX[lson] += d; 105 } 106 107 void turn(int l, int r) { 108 int pr = find_k(l - 1), nx = find_k(r + 1); 109 splay(pr, 0); splay(nx, pr); 110 tn[ch[nx][0]] ^= 1; 111 } 112 113 ll query(int l, int r) { 114 int pr = find_k(l - 1), nx = find_k(r + 1), lson; 115 splay(pr, 0); splay(nx, pr); 116 pushdown(lson = ch[nx][0]); 117 return MAX[lson]; 118 } 119 120 int main() 121 { 122 n = rd; q = rd; 123 init(); 124 for(; q; q--) { 125 int k = rd, x = rd + 1, y = rd + 1; 126 if(k == 1) cg_ad(x, y, rd); 127 if(k == 2) turn(x, y); 128 if(k == 3) printf("%lld\n", query(x, y)); 129 } 130 }