Pagini recente » Cod sursa (job #3038694) | Cod sursa (job #3272500) | Cod sursa (job #1976394) | Cod sursa (job #425382) | Cod sursa (job #459267)
Cod sursa(job #459267)
#include <cstdio>
#define file_in "hotel.in"
#define file_out "hotel.out"
#define nmax 601001
int n,m;
int a,b,tip;
struct arbint
{
int st,dr,sum;
}
ai[nmax];
void citire()
{
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &n, &m);
}
void build(int nod, int ls, int ld)
{
int mij=(ls+ld)>>1;
ai[nod].dr=ai[nod].st=ai[nod].sum=ld-ls+1;
if (ls==ld)
return ;
build(2*nod,ls,mij);
build(2*nod+1,mij+1,ld);
}
inline int min(int a, int b) { return a<b?a:b; }
inline int max(int a, int b) { return a>b?a:b; }
void update(int nod, int ls, int ld)
{
int mij=(ls+ld)>>1;
if (a<=ls && ld<=b)
{
if (tip==1)
ai[nod].st=ai[nod].dr=ai[nod].sum=0;
else
ai[nod].st=ai[nod].dr=ai[nod].sum=ld-ls+1;
return ;
}
if (tip==1 && ai[nod].sum==ls-ld+1)
{
ai[2*nod].sum=ai[2*nod].dr=ai[2*nod].st=mij-ls+1;
ai[2*nod+1].sum=ai[2*nod+1].dr=ai[2*nod+1].st=ld-mij;
}
if (tip==2 && ai[nod].sum==0)
{
ai[2*nod].sum=ai[2*nod].dr=ai[2*nod].st=0;
ai[2*nod+1].sum=ai[2*nod+1].dr=ai[2*nod+1].st=0;
}
if (a<=mij)
update(2*nod,ls,mij);
if (mij<b)
update(2*nod+1,mij+1,ld);
if (ai[2*nod].sum==mij-ls+1)
ai[nod].st=ai[2*nod].sum+ai[2*nod+1].st;
else
ai[nod].st=ai[2*nod].st;
if (ai[2*nod+1].sum==ld-mij)
ai[nod].dr=ai[2*nod].dr+ai[2*nod+1].sum;
else
ai[nod].dr=ai[2*nod+1].dr;
ai[nod].sum=ai[2*nod+1].st+ai[2*nod].dr;
ai[nod].sum=max(ai[nod].sum,ai[nod].dr);
ai[nod].sum=max(ai[nod].sum,ai[nod].st);
ai[nod].sum=max(ai[2*nod].sum,ai[nod].sum);
ai[nod].sum=max(ai[2*nod+1].sum,ai[nod].sum);
}
void solve()
{
build(1,1,n);
while(m--)
{
scanf("%d", &tip);
if (tip==1 || tip==2)
{
scanf("%d %d", &a, &b);
b+=(a-1);
update(1,1,n);
}
else
printf("%d\n", ai[1].sum);
}
}
int main()
{
citire();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}