Cod sursa(job #531729)

Utilizator ConsstantinTabacu Raul Consstantin Data 10 februarie 2011 09:57:41
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include<stdio.h>
int n,m,i,j,a,b;

struct ai{int l,r,mm;}v[ 400010 ];

int max(int a,int b,int c)
	{if(a>=b && a>=c)return a;
	if(b>=a && b>=c )return b;
	if(c>=a && c>=b)return c;
	}

void insert(int a,int b,int p,int u,int nod){
int m = (p+u)>>1;
int f1 = nod<<1,f2 = f1+1;

if(a<=p && u<=b)
		{v[nod].l = v[nod].r = u-p+1;
		v[nod].mm = u-p+1;
		return ;
		}
else
if(a>u || b < p)
		return;
else
	{if(v[nod].l+p-1 >= m)
		v[f1].l = v[f1].r = v[f1].mm = m-p+1;
	
	if(v[nod].mm == 0)
		v[f1].mm = v[f1].l = v[f1].r = 0;
	
	insert(a,b,p,m,f1);
		
	if( v[nod].r  >=u- m )
		v[f2].l = v[f2].r = v[f2].mm = u-m;
	if(v[nod].mm == 0 )
		v[f2].mm = v[f2].l = v[f2].r = 0;
	insert(a,b,m+1,u,f2);
		
		if(v[f1].l == m-p+1)
			v[nod].l = v[f1].l+v[f2].l;
		else
			v[nod].l = v[f1].l;
		
		if(v[f2].r == u-m)
			v[nod].r = v[f1].r+v[f2].r;
		else
			v[nod].r = v[f2].r;
		
		v[nod].mm = max(v[nod].l,v[nod].r,v[f1].r+v[f2].l);
		v[nod].mm = max(v[nod].mm,v[f1].mm,v[f2].mm);
	}
}

void rem(int a,int b,int p,int u,int nod){
int m = (p+u)>>1;
int f1 = nod<<1,f2 = f1+1;

if(a <= p && u<=b)
	{v[nod].l = v[nod].r = v[nod].mm = 0;
	return;
	}
else
if(a>u || b < p)
		return;
else
	{if(v[nod].l+p-1 >= m)
		v[f1].l = v[f1].r = v[f1].mm = m-p+1;
	
	if(v[nod].mm == 0)
		v[f1].mm = v[f1].l = v[f1].r = 0;
	
	rem(a,b,p,m,f1);
		
	if( v[nod].r  >=u- m )
		v[f2].l = v[f2].r = v[f2].mm = u-m;
	if(v[nod].mm == 0 )
		v[f2].mm = v[f2].l = v[f2].r = 0;
	rem(a,b,m+1,u,f2);
		
		if(v[f1].l == m-p+1)
			v[nod].l = v[f1].l+v[f2].l;
		else
			v[nod].l = v[f1].l;
		
		if(v[f2].r == u-m)
			v[nod].r = v[f1].r+v[f2].r;
		else
			v[nod].r = v[f2].r;
		
		v[nod].mm = max(v[nod].l,v[nod].r,v[f1].r+v[f2].l);
		v[nod].mm = max(v[nod].mm,v[f1].mm,v[f2].mm);
		
	}

}

void citire(){
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	int i,a,b,c;
	v[1].l = v[1].r = v[1].mm = n;
	
	for(i = 1 ; i<=m;i++)
		{scanf("%d",&a);
		if(a == 3)
			{printf("%d\n",v[1].mm);
			continue;}
		
		scanf("%d %d",&b,&c);
		if(a==1){
			c = b+c-1;
			rem(b,c,1,n,1);
			}
		else
			{c = b+c-1;
			insert(b,c,1,n,1);}
		}
	}


int main(){

citire();

return 0;}