Pagini recente » Cod sursa (job #2436617) | Cod sursa (job #2014336) | Cod sursa (job #1376687) | Cod sursa (job #3207984) | Cod sursa (job #1042998)
#include<fstream>
#define MAXN 1<<18
using namespace std;
int n,p,sleft[MAXN],sright[MAXN],s[MAXN],x,y,val;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
void update(int nod,int st,int dr)
{
if(x<=st && dr<=y)
{
s[nod]=sleft[nod]=sright[nod]=(dr-st+1)*val;
return;
}
int m=(st+dr)/2;
if(s[nod]==0)
{
s[2*nod]=sleft[2*nod]=sright[2*nod]=0;
s[2*nod+1]=sleft[2*nod+1]=sright[2*nod+1]=0;
}
if(s[nod]==(dr-st+1))
{
s[2*nod]=sleft[2*nod]=sright[2*nod]=m-st+1;
s[2*nod+1]=sleft[2*nod+1]=sright[2*nod+1]=dr-m;
}
if(x<=m)
update(2*nod,st,m);
if(y>m)
update(2*nod+1,m+1,dr);
s[nod]=max(sright[2*nod]+sleft[2*nod+1],max(s[2*nod],s[2*nod+1]));
sleft[nod]=sleft[2*nod];
if(sleft[2*nod]==m-st+1)
sleft[nod]+=sleft[2*nod+1];
sright[nod]=sright[2*nod+1];
if(sright[2*nod+1]==dr-m)
sright[nod]+=sright[2*nod];
}
int main()
{
int a;
fin>>n>>p;
s[1]=sleft[1]=sright[1]=n;
for(int i=1;i<=p;i++)
{
fin>>a;
switch(a)
{
case 1:
fin>>x>>y;
y+=x-1;
val=0;
update(1,1,n);
break;
case 2:
fin>>x>>y;
y+=x-1;
val=1;
update(1,1,n);
break;
case 3:
fout<<s[1]<<"\n";
}
}
return 0;
}