Pagini recente » Cod sursa (job #1554909) | Cod sursa (job #2439372) | Cod sursa (job #1076614) | Cod sursa (job #721292) | Cod sursa (job #2004245)
#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)
{
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;
}