Pagini recente » Cod sursa (job #1633598) | Cod sursa (job #168384) | Cod sursa (job #1157794) | Cod sursa (job #804686) | Cod sursa (job #1895360)
#include <fstream>
#include <queue>
#define nmax 100050
#include <cstring>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
queue <int> C;
struct arb
{
int l;
int maxl,maxr,maxt;
};
arb a[4*nmax];
int n,m,Narb;
bool viz[nmax];
void Change()
{
int t,i;
while(!C.empty())
{
t=C.front();
C.pop();
i=t*2;
{
a[t].maxt=max(a[i].maxt,a[i+1].maxt);
a[t].maxt=max(a[t].maxt, a[i].maxr+a[i+1].maxl);
if( a[i].maxl==a[i].l )
a[t].maxl=a[i].l+a[i+1].maxl;
else a[t].maxl=a[i].maxl;
if(a[i+1].maxr==a[i+1].l )
a[t].maxr=a[i+1].maxr+a[i].maxr;
else a[t].maxr=a[i+1].maxr;
}
if(t/2>0)
if(viz[t/2]==0)
{C.push(t/2); viz[t/2]=1; }
}
memset(viz,0,sizeof(viz));
}
void Change1(int x,int y,int z)
{int i;
x=x+Narb-1;
for(i=x;i<=x+y-1;i++)
{ a[i].maxl=a[i].maxr=a[i].maxt=z;
if(i%2==1) C.push(i/2);
}
Change();
}
int main()
{ fin>>n>>m;
int i;
Narb=1;
while(Narb<n) Narb*=2;
for(i=0;i<n;++i)
a[Narb+i].l=a[Narb+i].maxl=a[Narb+i].maxr=a[Narb+i].maxt=1;
for(i=Narb-1;i>=1;--i)
{ a[i].l=a[i*2].l+a[i*2+1].l;
a[i].maxt= a[i*2].maxr+a[i*2+1].maxl;
a[i].maxr=a[i].maxl=a[i].maxt;
}
int op,x,y;
for(i=1;i<=m;++i)
{ fin>>op;
if(op==3)
fout<<a[1].maxt<<"\n";
if(op==1)
{ fin>>x>>y;
Change1(x,y,0);
}
if(op==2)
{ fin>>x>>y;
Change1(x,y,1);
}
}
return 0;
}