Pagini recente » Cod sursa (job #595277) | Cod sursa (job #224665) | Cod sursa (job #254142) | Cod sursa (job #2407001) | Cod sursa (job #1976384)
#include <iostream>
#include <fstream>
#define dim 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct arbore
{
int best,left,right;
};
arbore arb[4*dim];
int n,p,caz,a,b;
void update(int nod,int st,int dr)
{
if(st>b||dr<a)return;
if(a<=st&&dr<=b)
{
if(caz==1)
arb[nod].best=arb[nod].right=arb[nod].left=0;
else
arb[nod].best=arb[nod].right=arb[nod].left=dr-st+1;
return;
}
int mij=(st+dr)/2;
if(arb[nod].best==0)
arb[2*nod].best=arb[2*nod].left=arb[2*nod].right=arb[2*nod+1].best=arb[2*nod+1].right=arb[2*nod+1].left=0;
if(arb[nod].best==dr-st+1)
{
arb[2*nod].best=arb[2*nod].right=arb[2*nod].left=mij-st+1;
arb[2*nod+1].best=arb[2*nod+1].right=arb[2*nod+1].left=dr-mij;
}
update(2*nod,st,mij);
update(2*nod+1,mij+1,dr);
arb[nod].best=max(max(arb[2*nod].best,arb[2*nod+1].best),arb[2*nod].right+arb[2*nod+1].left);
arb[nod].left=arb[2*nod].left;
arb[nod].right=arb[2*nod+1].right;
if(arb[2*nod].left==mij-st+1)
arb[nod].left+=arb[2*nod+1].left;
if(arb[2*nod+1].right==dr-mij)
arb[nod].right+=arb[2*nod].right;
}
int main()
{
f>>n>>p;
int N=1;
while(N<n)N*=2;
for(int i=0; i<n; ++i)
arb[N+i].best=arb[N+i].right=arb[N+i].left=1;
for(int i=N-1; i>=1; --i)
arb[i].best=arb[i].right=arb[i].left=arb[i*2].right+arb[i*2+1].left;
for(int i=1; i<=p; i++)
{
f>>caz;
if(caz==3)
g<<arb[1].best<<'\n';
else
{
f>>a>>b;
b+=a-1;
update(1,1,n);
}
}
f.close();
g.close();
return 0;
}