Pagini recente » Cod sursa (job #2352535) | Cod sursa (job #2946848) | Cod sursa (job #1660030) | Cod sursa (job #3219988) | Cod sursa (job #1472806)
#include <iostream>
#include <stdio.h>
#define NMax 100001
#define ArbMax 400001
using namespace std;
int S[ArbMax],D[ArbMax],M[ArbMax],N,x,y,op,Q;
void Update(int nod,int s,int d)
{
if(x<=s && d<=y)
{
if(op==2)
S[nod]=D[nod]=M[nod]=d-s+1;
else S[nod]=D[nod]=M[nod]=0;
return;
}
int mij=(s+d)/2;
if(M[nod]==0)
{
S[nod*2]=M[nod*2]=D[nod*2]=0;
S[nod*2+1]=M[nod*2+1]=D[nod*2+1]=0;
}
if(M[nod]==d-s+1)
{
S[nod*2]=M[nod*2]=D[nod*2]=mij-s+1;
S[nod*2+1]=M[nod*2+1]=D[nod*2+1]=d-mij;
}
if(x<=mij)
Update(nod*2,s,mij);
if(y>mij)
Update(2*nod+1,mij+1,d);
if(S[nod*2]==mij-s+1)
S[nod]=S[nod*2]+S[nod*2+1];
else
S[nod]=S[nod*2];
if(D[nod*2+1]==d-mij)
D[nod]=D[nod*2]+D[nod*2+1];
else
D[nod]=D[nod*2+1];
M[nod]=max(max(M[nod*2],M[nod*2+1]),D[2*nod]+S[nod*2+1]);
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&N,&Q);
for(int i=1;i<=N;i++)
{
x=i;
y=i;
op=2;
Update(1,1,N);
}
for(int i=1;i<=Q;i++)
{
scanf("%d",&op);
if(op==3)
printf("%d\n",M[1]);
else
{
scanf("%d %d",&x,&y);
y=x+y-1;
Update(1,1,N);
}
}
}