Pagini recente » Cod sursa (job #327797) | Borderou de evaluare (job #826670) | Cod sursa (job #1010196) | Cod sursa (job #933415) | Cod sursa (job #387139)
Cod sursa(job #387139)
#include<stdio.h>
long n,p,m,pos,val,start,finish;
int c;
struct la
{
void init(long a)
{
lmax=lleft=lright=a;
}
long lmax,lleft,lright,st,dr;
}arb[400100];
inline long MAX(long a,long b)
{
if(a>=b)return a;
return b;
}
void init(long nod,long left,long 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(long nod,long left,long 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=arb[nod].dr-arb[nod].st+1)
{
arb[nod*2].init((arb[nod].dr+arb[nod].st)/2-arb[nod].st+1);
arb[nod*2+1].init(arb[nod].dr-(arb[nod].st+arb[nod].dr)/2);
}
long 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;
arb[nod].lright=arb[nod*2+1].lright;
int ok=0;
if(arb[nod].lmax==arb[nod].dr-arb[nod].st+1)
{arb[nod].lleft=arb[nod].lright=arb[nod].lmax;ok=1;}
if(!ok&&arb[nod*2+1].lmax==arb[nod*2+1].lright&&arb[nod*2+1].lmax==arb[nod*2+1].dr-arb[nod*2+1].st+1)
arb[nod].lright+=arb[nod*2].lright;
if(!ok&&arb[nod*2].lmax==arb[nod*2].lright&&arb[nod*2].lmax==arb[nod*2].dr-arb[nod*2].st+1)
arb[nod].lleft+=arb[nod*2+1].lleft;
}
int main()
{
FILE*f=fopen("hotel.in","r");
fscanf(f,"%ld %ld",&n,&p);
init(1,1,n);
FILE*g=fopen("hotel.out","w");
for(;p;--p)
{
fscanf(f,"%d",&c);
if(c!=3)
{
fscanf(f,"%ld %ld",&pos,&m);
val=(c-1);
start=pos;
finish=pos+m-1;
update(1,1,n);
}
else
{
fprintf(g,"%ld\n",arb[1].lmax);
}
}
fclose(f);
fclose(g);
return 0;
}