Pagini recente » Cod sursa (job #2787002) | Cod sursa (job #2621826) | Cod sursa (job #218807) | Cod sursa (job #2961321) | Cod sursa (job #1827366)
#include <iostream>
#include <fstream>
#define Nmax 100010
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct elem
{
int left,right,best;
}arb[4*Nmax];
int n,start,finish,maxim,x,y;
void egal(int nod,int x)
{
arb[nod].left=x;
arb[nod].right=x;
arb[nod].best=x;
}
void update(int nod,int st,int dr,int val){
//update pe intervalul [x,y]
if(start<=st && dr<=finish){
if(val==1){
egal(nod,dr-st+1);}
else{
egal(nod,0);
}
return;
}
int mij=(st+dr)/2;
if(arb[nod].best==0){
egal(2*nod,0);
egal(2*nod+1,0);
}
if(arb[nod].best==dr-st+1){
egal(2*nod,mij-st+1);
egal(2*nod+1,dr-mij);
}
if(start<=mij)
update(2*nod,st,mij,val);
if(mij<finish)
update(2*nod+1,mij+1,dr,val);
arb[nod].best=max(arb[2*nod].right+arb[2*nod+1].left ,max(arb[2*nod].best,arb[2*nod+1].best));
if(arb[2*nod].left==mij-st+1)
arb[nod].left=arb[2*nod].left+arb[2*nod+1].left;
else arb[nod].left=arb[2*nod].left;
if(arb[2*nod+1].right==dr-mij)
arb[nod].right=arb[2*nod].right+arb[2*nod+1].right;
else arb[nod].right=arb[2*nod+1].right;
}
int main()
{
int m;
f >> n >> m;
for(int i=1;i<=n;i++)
{
start=i;
finish=i;
update(1,1,n,1);
}
int opt;
for(int i=0;i<m;i++)
{
f >> opt;
start=0;
finish=0;
if(opt==1)
{
f>> start >> finish;
finish=start+finish-1;
update(1,1,n,0);
}
if(opt==2)
{
f>> start >> finish ;
finish=start+finish-1;
update(1,1,n,1);
}
if(opt==3){
g << arb[1].best << "\n";
}
}
return 0;
}