Pagini recente » Cod sursa (job #678257) | Cod sursa (job #1642091) | Cod sursa (job #1554669) | Cod sursa (job #694225) | Cod sursa (job #1829581)
#include <fstream>
#include <iostream>
#define dim 100010
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int L[4*dim],R[4*dim],TIP[4*dim], BEST[4*dim];
int n,m, op,A,B,val,st,dr,N;
void Update(int nod, int left, int right)
{
int FD = (nod<<1)+1, FS = nod<<1;
if(left>dr || right <st)
return;
if(left == right && st<=left && right <= dr)
{
TIP[nod] = BEST[nod] = L[nod] = R[nod] = val;
return;
}
int mid = (left+right)/2;
Update(FS, left, mid);
Update(FD, mid+1, right);
if(TIP[FS] == TIP[FD])
{
if(TIP[FS]!=2)
{
TIP[nod] = TIP[FS];
BEST[nod] = BEST[FS] + BEST[FD];
L[nod] = R[nod] = BEST[nod];
return;
}
TIP[nod]=2;
L[nod]=L[FS];
R[nod]=R[FD];
BEST[nod]=max(BEST[FS], BEST[FD]);
BEST[nod]=max(BEST[nod], R[FS]+L[FD]);
return;
}
L[nod]=L[FS]; R[nod]=R[FD]; TIP[nod]=2;
if(TIP[FS]==1)
L[nod] = L[FS] + L[FD];
if(TIP[FD]==1)
R[nod] = R[FD] + R[FS];
BEST[nod] = max(BEST[FS], BEST[FD]);
BEST[nod]=max(BEST[nod], R[FS]+L[FD]);
}
int main()
{
fin>>n>>m;
for(N=1;N<n;N<<=1);
st=1; dr=n; val=1;
Update(1,1,N);
while(m--)
{
fin>>op;
if(op==3)
fout<<BEST[1]<<'\n';
else
{
fin>>A>>B;
if(op==1)
{
val=0;st=A;dr=A+B-1;
Update(1,1,N);
}
else
{
val=1;st=A;dr=A+B-1;
Update(1,1,N);
}
}
}
return 0;
}