Pagini recente » Cod sursa (job #2300102) | Cod sursa (job #67128) | Cod sursa (job #2861761) | Cod sursa (job #3135516) | Cod sursa (job #387155)
Cod sursa(job #387155)
#include<stdio.h>
int n,p,m,pos,val,start,finish;
int c;
struct la
{
void init(int a)
{
lmax=lleft=lright=a;
}
int lmax,lleft,lright;
}arb[400100];
inline int MAX(int a,int b)
{
if(a>=b)return a;
return b;
}
void init(int nod,int left,int right)
{
arb[nod].init(right-left+1);
if(left==right)
return ;
init(nod*2,left,(left+right)/2);
init(nod*2+1,(left+right)/2+1,right);
}
void update(int nod,int left,int right)
{
if( start<=left && right<=finish )
{
arb[nod].init(val*(right-left+1));
return;
}
if(arb[nod].lmax==0)
{
arb[nod*2].init(0);
arb[nod*2+1].init(0);
}
else
if(arb[nod].lmax=right-left+1)
{
arb[nod*2].init((right+left)/2-left+1);
arb[nod*2+1].init(right-(left+right)/2);
}
int div=(left+right)/2;
if(start<=div)update(nod*2,left,div);
if(div<finish)update(nod*2+1,div+1,right);
arb[nod].lmax=MAX(MAX(arb[nod*2].lmax,arb[nod*2+1].lmax),arb[nod*2].lright+arb[nod*2+1].lleft);
arb[nod].lleft=arb[nod*2].lleft;
if(arb[nod*2].lleft==(left+right)/2-left+1)
arb[nod].lleft+=arb[nod*2+1].lleft;
arb[nod].lright=arb[nod*2+1].lright;
if(arb[nod*2+1].lright==right-(left+right)/2)
arb[nod].lright+=arb[nod*2].lright;
}
int main()
{
FILE*f=fopen("hotel.in","r");
fscanf(f,"%d %d",&n,&p);
init(1,1,n);
FILE*g=fopen("hotel.out","w");
for(;p;--p)
{
fscanf(f,"%d",&c);
if(c!=3)
{
fscanf(f,"%d %d",&pos,&m);
val=(c-1);
start=pos;
finish=pos+m-1;
update(1,1,n);
}
else
{
fprintf(g,"%d\n",arb[1].lmax);
}
}
fclose(f);
fclose(g);
return 0;
}