题目 代码
#include<bits/stdc++.h>
#define sl (id<<1)
#define sr (id<<1|1)
#define fa (id>>1);
using namespace std;
int n, p;
int read() {
int sum=0, f=1;
char t=getchar();
while (t<'0'||t>'9') {
if (t=='-')
f=-1;
t=getchar();
}
while (t>='0'&&t<='9') {
sum= (sum<<3)+ (sum<<1)+t-'0';
t=getchar();
}
return sum*f;
}
struct __tree {
int l, r, flag, lmax, rmax, maxx;
__tree operator+ (const __tree&x) {
__tree temp;
temp.l=l, temp.r=x.r;
temp.maxx=max (max (maxx, x.maxx), rmax+x.lmax);
if (lmax==r-l+1)
temp.lmax=lmax+x.lmax;
else
temp.lmax=lmax;
if (x.rmax==x.r-x.l+1)
temp.rmax=x.rmax+rmax;
else
temp.rmax=x.rmax;
temp.flag=0;
return temp;
}
} tree[45];
void build (int l, int r, int id) {
tree[id].l=l, tree[id].r=r, tree[id].lmax=tree[id].rmax=tree[id].maxx=r-l+1, tree[id].flag=0;
if (l==r)
return ;
int mid= (l+r) >>1;
build (l, mid, sl);
build (mid+1, r, sr);
}
void update (int l, int r, int color, int id) {
if (tree[id].l==l&&tree[id].r==r) {
if (color==2)
tree[id].lmax=tree[id].rmax=tree[id].maxx=r-l+1;
else
tree[id].lmax=tree[id].rmax=tree[id].maxx=0;
tree[id].flag=color;
return ;
}
if (tree[id].flag) {
tree[sl].flag=tree[sr].flag=tree[id].flag;
tree[id].flag=0;
tree[sl].lmax=tree[sr].lmax=tree[sl].rmax=tree[sr].rmax=tree[sl].maxx=tree[sr].maxx=0;
}
int mid= (tree[id].l+tree[id].r) >>1;
if (r<=mid)
update (l, r, color, sl);
else if (l>mid)
update (l, r, color, sr);
else
update (l, mid, color, sl), update (mid+1, r, color, sr);
tree[id]=tree[sl]+tree[sr];
}
int que_max() {
return tree[1].maxx;
}
int main() {
n=read(), p=read();
build (1, n, 1);
for (int i=1; i<=p; i++) {
int op, x, y;
op=read();
if (op==3)
cout<<que_max() <<endl;
else {
x=read(), y=read();
update (x, x+y-1, op, 1);
}
}
return 0;
}