Pagini recente » Cod sursa (job #2444250) | Cod sursa (job #2377057) | Cod sursa (job #126624) | Cod sursa (job #2583325) | Cod sursa (job #3131551)
#include <fstream>
using namespace std;
long long P,N,arb[800001],a,b,c,lsum[800001],rsum[800001],add[800001];
ifstream f ("hotel.in");
ofstream g ("hotel.out");
void build(int nod,int st, int dr)
{
arb[nod]=dr-st+1;
lsum[nod]=dr-st+1;
rsum[nod]=dr-st+1;
if(st<dr)
{
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
}
}
void upd(int nod,int st,int dr,int a,int b,int val)
{
if(a<=st && dr<=b)
{
add[nod]=val;
if(val==1)
{
arb[nod]=dr-st+1;
lsum[nod]=dr-st+1;
rsum[nod]=dr-st+1;
}
else
{
arb[nod]=0;
lsum[nod]=0;
rsum[nod]=0;
}
}
else
{
int mij=(st+dr)/2;
if(add[nod]==1)
{
arb[2*nod]=mij-st+1;
lsum[2*nod]=mij-st+1;
rsum[2*nod]=mij-st+1;
arb[2*nod+1]=dr-mij;
lsum[2*nod+1]=dr-mij;
rsum[2*nod+1]=dr-mij;
add[2*nod]=1;
add[2*nod+1]=1;
}
else if(add[nod]==-1)
{
arb[2*nod]=0;
lsum[2*nod]=0;
rsum[2*nod]=0;
arb[2*nod+1]=0;
lsum[2*nod+1]=0;
rsum[2*nod+1]=0;
add[2*nod]=-1;
add[2*nod+1]=-1;
}
add[nod]=0;
if(a<=mij)
upd(2*nod,st,mij,a,b,val);
if(mij<b)
upd(2*nod+1,mij+1,dr,a,b,val);
if(lsum[2*nod]==mij-st+1)
lsum[nod]=lsum[2*nod]+lsum[2*nod+1];
else
lsum[nod]=lsum[2*nod];
if(rsum[2*nod+1]==dr-mij)
rsum[nod]=rsum[2*nod]+rsum[2*nod+1];
else
rsum[nod]=rsum[2*nod+1];
arb[nod]=max(max(arb[2*nod],arb[2*nod+1]),rsum[2*nod]+lsum[2*nod+1]);
}
}
int main()
{
f>>N>>P;
build(1,1,N);
for(int i=1;i<=P;i++)
{
f>>c;
if(c==3)
g<<arb[1]<<'\n';
else
{
f>>a>>b;
upd(1,1,N,a,a+b-1,2*c-3);
}
}
f.close();
g.close();
return 0;
}