rt
调了好久了,样例总是输出 1
#include <ctime>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
inline int read() {
int w = 1, s = 0; char c;
while(!isdigit(c = getchar())) if(c == '-') w = -1;
while(isdigit(c)) s = (s << 1) + (s << 3) + (c & 15), c = getchar();
return s * w;
}
struct Node { int l, r, v, rand, siz, rev, tag, maxx; };
Node tr[N];
int siz, rt, x, y, z;
inline void push_up(int x) {
tr[x].siz = tr[tr[x].l].siz + tr[tr[x].r].siz + 1;
tr[x].maxx = tr[x].v;
if(tr[x].l) tr[x].maxx = max(tr[x].maxx, tr[tr[x].l].maxx);
if(tr[x].r) tr[x].maxx = max(tr[x].maxx, tr[tr[x].r].maxx);
}
inline void push_down(int x) {
if(tr[x].rev) {
if(tr[x].l) tr[tr[x].l].rev ^= 1;
if(tr[x].r) tr[tr[x].r].rev ^= 1;
tr[x].l ^= tr[x].r ^= tr[x].l ^= tr[x].r;
tr[x].rev = 0;
} if(tr[x].tag) {
if(tr[x].l) tr[tr[x].l].tag += tr[x].tag, tr[tr[x].l].maxx += tr[x].tag, tr[tr[x].l].v += tr[x].tag;
if(tr[x].r) tr[tr[x].r].tag += tr[x].tag, tr[tr[x].r].maxx += tr[x].tag, tr[tr[x].r].v += tr[x].tag;
tr[x].tag = 0;
push_up(x);
}
}
inline void split(int now, int v, int &x, int &y) {
if(!now) { x = y = 0; return; }
push_down(now);
if(tr[now].v <= v) x = now, split(tr[now].r, v, tr[now].r, y);
else y = now, split(tr[now].l, v, x, tr[now].l);
push_up(now);
}
inline int merge(int x, int y) {
push_down(x); push_down(y);
if(!x || !y) return x | y;
if(tr[x].rand < tr[y].rand) {
tr[x].r = merge(tr[x].r, y);
push_up(x);
return x;
} else {
tr[y].l = merge(tr[y].l, x);
push_up(y);
return y;
}
}
//inline int getrk(int now, int k) {
//
// while(1) {
// if(k <= tr[tr[now].l].siz) now = tr[now].l;
// else if(k == tr[tr[now].l].siz + 1) return now;
// else k -= tr[tr[now].l].siz + 1, now = tr[now].r;
// }
//
//}
inline void modify1(int l, int r, int v) {
int x, y, z;
split(rt, l - 1, x, y);
split(y, r - l + 1, y, z);
tr[y].maxx += v;
tr[y].tag += v;
tr[y].v += v;
rt = merge(merge(x, y), z);
}
inline void modify2(int l, int r) {
split(rt, l - 1, x, y);
split(y, r - l + 1, y, z);
tr[y].rev ^= 1;
rt = merge(merge(x, y), z);
}
inline void query(int l, int r) {
split(rt, l - 1, x, y);
split(y, r - l + 1, y, z);
printf("%d\n", tr[y].maxx);
rt = merge(merge(x, y), z);
}
inline int create(int v) {
tr[++ siz].siz = 1;
tr[siz].v = v;
tr[siz].rand = rand();
tr[siz].maxx = v;
rt = merge(rt, siz);
return siz;
}
inline int insert(int v) {
split(rt, v, x, y);
rt = merge(merge(x, create(v)), y);
}
int main() {
srand(time(NULL));
int n = read(), m = read();
for(int i = 1;i <= n; i ++ ) insert(0);
for(int i = 1;i <= m; i ++ ) {
int opt = read(), l = read(), r = read(), v;
if(opt == 1) v = read(), modify1(l, r, v);
if(opt == 2) modify2(l, r);
if(opt == 3) query(l, r);
}
}