Pagini recente » Cod sursa (job #2347296) | Cod sursa (job #1051990) | Cod sursa (job #991976) | Clasament 148 | Cod sursa (job #2909395)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int NMAX=(1<<18);
int lung[NMAX], lungst[NMAX], lungdr[NMAX],a,b;
void aint(int p, int st, int dr)
{
int mij;
lung[p]=lungst[p]=lungdr[p]=dr-st+1;
if(st==dr)
return;
mij=(st+dr)/2;
aint(2*p,st,mij);
aint(2*p+1,mij+1,dr);
}
void update(int p, int st, int dr, bool ok)
{
int mij;
if(st==dr)
{
if(ok==1)
lung[p]=lungst[p]=lungdr[p]=0;
else
lung[p] =lungst[p] =lungdr[p]=dr-st+1;
return;
}
mij=(st+dr)/2;
if (lung[p] == dr-st+1)
{
lung[2*p] =lungst[2*p] =lungdr[2*p]=mij-st+1;
lung[2*p+1] =lungst[2*p+1] =lungdr[2*p+1]=dr-mij;
}
if (lung[p]==0)
{
lung[2*p]=lungst[2*p]=lungdr[2*p]=0;
lung[2*p+1]=lungst[2*p+1]=lungdr[2*p+1]=0;
}
if(a<= st && dr<=b)
{
if(ok==1)
lung[p]=lungst[p]=lungdr[p]=0;
else
lung[p] =lungst[p] =lungdr[p]=dr-st+1;
return;
}
if(a<=mij)
update(2*p,st,mij,ok);
if(b>mij)
update(2*p+1,mij+1,dr,ok);
if(lung[2*p]==mij-st+1)
lungst[p]=mij-st+1+lungst[2*p+1];
else
lungst[p]=lungst[2*p];
if(lung[2*p+1]==dr-mij)
lungdr[p]=dr-mij+lungdr[2*p];
else
lungdr[p]=lungdr[2*p+1];
lung[p]=max(lung[2*p],max(lung[2*p+1],lungdr[2*p]+lungst[2*p+1]));
}
int main()
{
int n,i,j,p,c,st,dr;
long long kon;
fin>>n>>p;
aint(1,1,n);
for(i=1;i<=p;i++)
{
fin>>c;
if(c==1 || c==2)
{
fin>>a>>b;
b=a+b-1;
if(c==1)
update(1,1,n,1);
else
update(1,1,n,0);
}
else
{
kon=lung[1];
fout<<kon<<"\n";
}
}
return 0;
}