Pagini recente » Cod sursa (job #1644325) | Cod sursa (job #1433782) | Cod sursa (job #197284) | Cod sursa (job #2642775) | Cod sursa (job #2150665)
#include <fstream>
#define MAX 100005
using namespace std;
ifstream fi("hotel.in");
ofstream fo("hotel.out");
int A[4*MAX],B[4*MAX],C[4*MAX];
bool lazy[4*MAX];
int n,p;
int st,dr;
void build(int nod,int l,int r)
{
A[nod]=B[nod]=C[nod]=r-l+1;
if (l==r)
return;
int mij=(l+r)/2;
build(2*nod,l,mij);
build(2*nod+1,mij+1,r);
}
void update(int nod,int l,int r,int tip)
{
if (st<=l && r<=dr)
{
if (tip==1)
A[nod]=B[nod]=C[nod]=0;
else
A[nod]=B[nod]=C[nod]=r-l+1;
lazy[nod]=1;
return;
}
int mij=(l+r)/2;
if (lazy[nod])
{
if (A[nod]!=0)
A[2*nod]=B[2*nod]=C[2*nod]=mij-l+1;
else
A[2*nod]=B[2*nod]=C[2*nod]=0;
if (A[nod]!=0)
A[2*nod+1]=B[2*nod+1]=C[2*nod+1]=r-mij;
else
A[2*nod+1]=B[2*nod+1]=C[2*nod+1]=0;
lazy[nod]=0;
lazy[2*nod]=lazy[2*nod+1]=1;
}
if (st<=mij)
update(2*nod,l,mij,tip);
if (dr>mij)
update(2*nod+1,mij+1,r,tip);
A[nod]=max(max(A[2*nod],A[2*nod+1]),C[2*nod]+B[2*nod+1]);
B[nod]=B[2*nod];
if (B[2*nod]==mij-l+1)
B[nod]+=B[2*nod+1];
C[nod]=C[2*nod+1];
if (C[2*nod+1]==r-mij)
C[nod]+=C[2*nod];
}
int main()
{
fi>>n>>p;
A[1]=B[1]=C[1]=n;
lazy[1]=1;
while (p--)
{
int P,a,b;
fi>>P;
if (P==1)
{
fi>>a>>b;
st=a,dr=a+b-1;
update(1,1,n,1);
}
else if (P==2)
{
fi>>a>>b;
st=a,dr=a+b-1;
update(1,1,n,-1);
}
else
{
fo<<A[1]<<"\n";
}
}
return 0;
}