Pagini recente » Cod sursa (job #747996) | Cod sursa (job #997132) | Cod sursa (job #3185534) | Cod sursa (job #3237982) | Cod sursa (job #432165)
Cod sursa(job #432165)
#include<iostream>
using namespace std;
#define NMAX 100001
#define max(a,b) ((a>b)?a:b)
using namespace std;
int maxa[4*NMAX+100],maxa_s[4*NMAX+100],maxa_d[4*NMAX+100];
int oc;
int st,fn;
void update(int n,int l,int r)
{
int cs=2*n;
int cd=2*n+1;
int m;
m=(l+r)/2;
if(st<=l && r<=fn)
{
if(!oc)
maxa[n]=maxa_s[n]=maxa_d[n]=r-l+1;
else
maxa[n]=maxa_s[n]=maxa_d[n]=0;
return;
}
if(oc && maxa[n]==r-l+1)
{
maxa[cs]=maxa_s[cs]=maxa_d[cs]=m-l+1;
maxa[cd]=maxa_s[cd]=maxa_d[cd]=r-m;
}
if(!oc && maxa[n]==0)
{
maxa[cs]=maxa_s[cs]=maxa_d[cs]=0;
maxa[cd]=maxa_s[cd]=maxa_d[cd]=0;
}
if(st<=m) update(cs,l,m);
if(m<fn)update(cd,m+1,r);
maxa[n]=max(maxa[cs],maxa[cd]);
maxa[n]=max(maxa[n],maxa_d[cs]+maxa_s[cd]);
maxa_s[n]=maxa_s[cs];
if(maxa[cs]==m-l+1)
maxa_s[n]=maxa[cs]+maxa_s[cd];
maxa_d[n]=maxa_d[cd];
if(maxa[cd]==r-m)
maxa_d[n]=maxa[cd]+maxa_d[cs];
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int i,n,m;
int a,b;
scanf("%d%d",&n,&m);
oc=0;
maxa[1]=maxa_s[1]=maxa_d[1]=n;
for(i=1;i<=m;i++)
{
int op;
scanf("%d",&op);
if(op!=3) scanf("%d%d",&a,&b);
switch(op)
{
case 1:
st=a; fn=a+b-1;
oc=1;
update(1,1,n);
break;
case 2:
st=a; fn=a+b-1;
oc=0;
update(1,1,n);
break;
case 3:
printf("%d\n",maxa[1]);
break;
}
}
return 0;
}