Pagini recente » Cod sursa (job #1740412) | Cod sursa (job #2707607) | Cod sursa (job #920238) | Cod sursa (job #2448173) | Cod sursa (job #409388)
Cod sursa(job #409388)
#include<stdio.h>
struct arbore
{
int max,st,dr;
};
int n,nrq,x,y;
arbore v[1<<18];
inline int max(int a, int b){return a>b?a:b;}
void update(int nod, int st, int dr, int t)
{
int m=(st+dr)>>1,left=(nod<<1),right=left|1;
if(t==1)
{
if(x<=st && dr<=y)
{
v[nod].max=v[nod].st=v[nod].dr=0;
return;
}
if(v[nod].max==dr-st+1)
{
v[left].max=v[left].st=v[left].dr=m-st+1;
v[right].max=v[right].st=v[right].dr=dr-m;
}
}
else
{
if(x<=st && dr<=y)
{
v[nod].max=v[nod].st=v[nod].dr=dr-st+1;
return;
}
if(v[nod].max==0)
{
v[left].max=v[left].st=v[left].dr=0;
v[right].max=v[right].st=v[right].dr=0;
}
}
if(x<=m)
update(left,st,m,t);
if(m<y)
update(right,m+1,dr,t);
v[nod].max=max(v[left].max,v[right].max);
v[nod].max=max(v[nod].max,v[left].dr+v[right].st);
v[nod].st=v[left].st;
if(v[left].max==m-st+1)
v[nod].st=v[left].max+v[right].st;
v[nod].dr=v[right].dr;
if(v[right].dr==dr-m)
v[nod].dr=v[right].max+v[left].dr;
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&nrq);
x=1;
y=n;
update(1,1,n,2);
int i,t;
for(i=1;i<=nrq;i++)
{
scanf("%d",&t);
if(t==3)
printf("%d\n",v[1].max);
else
{
scanf("%d%d",&x,&y);
y=y+x-1;
update(1,1,n,t);
}
}
return 0;
}