Pagini recente » Cod sursa (job #1470511) | Cod sursa (job #1736081) | Cod sursa (job #2687159) | Cod sursa (job #228148) | Cod sursa (job #1047098)
#include<fstream>
#define N 400100
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int M[N],S[N],D[N],a,b,k,l,i,n,m,t;
void p(int st,int dr,int po)
{
if(st==dr)
{
S[po]=D[po]=M[po]=dr-st+1;
return ;
}
int mij=(st+dr)>>1;
p(st,mij,po<<1);
p(mij+1,dr,(po<<1)+1);
S[po]=D[po]=M[po]=S[po<<1]+S[(po<<1)+1];
}
void u(int st,int dr,int po)
{
int mij=(st+dr)>>1;
if(st!=dr)
{
if(M[po]==0)
M[(po<<1)]=M[(po<<1)+1]=S[(po<<1)]=S[(po<<1)+1]=D[(po<<1)]=D[(po<<1)+1]=0;
if(M[po]==dr-st+1)
{
M[po<<1]=D[po<<1]=S[po<<1]=mij-st+1;
M[(po<<1)+1]=D[(po<<1)+1]=S[(po<<1)+1]=dr-mij;
}
}
if(st>=a&&dr<=b)
{
S[po]=D[po]=M[po]=0;
return ;
}
if(a<=mij)
u(st,mij,po<<1);
if(b>mij)
u(mij+1,dr,(po<<1)+1);
if(S[(po<<1)]==mij-st+1)
S[po]=S[(po<<1)]+S[(po<<1)+1];
else
S[po]=S[(po<<1)];
if(D[(po<<1)+1]==dr-mij)
D[po]=D[(po<<1)]+D[(po<<1)+1];
else
D[po]=D[(po<<1)+1];
M[po]=max(M[(po<<1)],max(M[(po<<1)+1],D[(po<<1)]+S[(po<<1)+1]));
}
void U(int st,int dr,int po)
{
int mij=(st+dr)>>1;
if(st!=dr)
{
if(M[po]==0)
M[(po<<1)]=M[(po<<1)+1]=S[(po<<1)]=S[(po<<1)+1]=D[(po<<1)]=D[(po<<1)+1]=0;
if(M[po]==dr-st+1)
{
M[po<<1]=D[po<<1]=S[po<<1]=mij-st+1;
M[(po<<1)+1]=D[(po<<1)+1]=S[(po<<1)+1]=dr-mij;
}
}
if(st>=a&&dr<=b)
{
S[po]=D[po]=M[po]=dr-st+1;
return ;
}
if(a<=mij)
U(st,mij,po<<1);
if(b>mij)
U(mij+1,dr,(po<<1)+1);
if(S[(po<<1)]==mij-st+1)
S[po]=S[(po<<1)]+S[(po<<1)+1];
else
S[po]=S[(po<<1)];
if(D[(po<<1)+1]==dr-mij)
D[po]=D[(po<<1)]+D[(po<<1)+1];
else
D[po]=D[(po<<1)+1];
M[po]=max(M[(po<<1)],max(M[(po<<1)+1],D[(po<<1)]+S[(po<<1)+1]));
}
int main ()
{
f>>n>>m;
p(1,n,1);
for(i=1;i<=m;++i)
{
f>>t;
if(t==1)
{
f>>k>>l;
a=k;
b=k+l-1;
u(1,n,1);
}
if(t==2)
{
f>>k>>l;
a=k;
b=k+l-1;
if(a==9&&b==10)
{
a++;
a--;
}
U(1,n,1);
}
if(t==3)
g<<M[1]<<"\n";
}
return 0;
}