Pagini recente » Cod sursa (job #1847152) | Cod sursa (job #2265987) | Cod sursa (job #46322) | Cod sursa (job #86003) | Cod sursa (job #1960817)
#include <algorithm>
#include <cstdio>
#define N 100001
#define mid ((l+r)/2)
#define left 2*n
#define right 2*n+1
using namespace std;
struct treenode{
int st,dr,best;
};
treenode a[4*N],zero;
int n,x,y,op;
void update(int n,int l,int r){
if (l==x && r==y) {
a[n].best=a[n].st=a[n].dr=(op-1)*(r-l+1);
return;
}
if (a[n].best==0) a[left]=a[right]=zero;
if (a[n].best==r-l+1) {
a[left].best=a[left].st=a[left].dr=mid-l+1;
a[right].best=a[right].st=a[right].dr=r-mid;
}
if (mid<x) update(right,mid+1,r);
else if (mid>=y) update(left,l,mid);
else {
int aux=x;
x=mid+1;
update(right,mid+1,r);
x=aux;aux=y;y=mid;
update(left,l,mid);
}
a[n].best=max(a[left].best,max(a[right].best,a[left].dr+a[right].st));
if (a[left].best==mid-l+1) a[n].st=a[left].best+a[right].st;
else a[n].st=a[left].st;
if (a[right].best==r-mid) a[n].dr=a[right].best+a[left].dr;
else a[n].dr=a[right].dr;
}
int main()
{
int m;
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&m);
x=1;y=n;op=2;
update(1,1,n);
while (m--){
scanf("%d",&op);
if (op==3) printf("%d\n",a[1].best);
else {
scanf("%d%d",&x,&y);
y+=x-1;
update(1,1,n);
}
}
return 0;
}