Pagini recente » Cod sursa (job #2350724) | Cod sursa (job #664953) | Cod sursa (job #716420) | Cod sursa (job #725144) | Cod sursa (job #793789)
Cod sursa(job #793789)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,i,j,m,a[300001],st[300001],dr[300001],val,poz;
int x,xi,xf;
void build(int nod,int left,int right)
{
int mij;
if(left==right)
{
a[nod]=st[nod]=dr[nod]=1;
return;
}
mij=(left+right)/2;
if(poz<=mij)
build(2*nod,left,mij);
else
build(2*nod+1,mij+1,right);
a[nod]=a[nod*2]+a[nod*2+1];
st[nod]=a[nod];
dr[nod]=a[nod];
}
void update(int nod,int left,int right,int val)
{
int mij;
if(left>=xi&&right<=xf)
{
if(x==2)
val=right-left+1;
else
val=0;
a[nod]=st[nod]=dr[nod]=val;
return;
}
mij=(left+right)/2;
if(a[nod]==0)
{
a[2*nod]=a[2*nod+1]=0;
st[2*nod]=st[2*nod+1]=0;
dr[2*nod]=dr[2*nod+1]=0;
}
if(a[nod]==right-left+1)
{
a[2*nod]=st[2*nod]=dr[2*nod]=mij-left+1;
a[2*nod+1]=st[2*nod+1]=dr[2*nod+1]=right-mij;
}
if(xi<=mij)
update(nod*2,left,mij,val);
if(xf>mij)
update(nod*2+1,mij+1,right,val);
a[nod]=max(a[2*nod],max(a[2*nod+1],dr[2*nod]+st[2*nod+1]));
if(st[2*nod]<mij-left+1)
st[nod]=st[2*nod];
else
st[nod]=st[2*nod]+st[2*nod+1];
if(dr[2*nod+1]<right-mij)
dr[nod]=dr[2*nod+1];
else
dr[nod]=dr[2*nod]+dr[2*nod+1];
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
{
val=1;
poz=i;
build(1,1,n);
}
for(i=1;i<=m;++i)
{
f>>x;
if(x==3)
g<<a[1]<<"\n";
else
{
f>>xi>>xf;
xf+=xi-1;
if(x==2)
update(1,1,n,1);
else
if(x==1)
update(1,1,n,0);
}
}
return 0;
}