Cod sursa(job #743139)

Utilizator costyv87Vlad Costin costyv87 Data 3 mai 2012 14:49:51
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f,*g;
struct cp{int lst,ldr,lint; } H[250000];

int x,y,n,p,z,i;

void init(int nod, int st, int dr) 
{	
	H[nod].lst=H[nod].ldr=H[nod].lint=dr-st+1;
	
	if (st!=dr) 
	{
		int m=(st+dr)/2;
		init(nod*2,st,m);
		init(nod*2+1,m+1,dr);
	}
	
}

void update(int nod, int st, int dr , bool ok ) 
{

	if (ok==true) 
		{
			if (x<=st && dr<=y) 
				{
				H[nod].lint=H[nod].lst=H[nod].ldr=0;
				return ;
				}
			int m=(st+dr)/2;
			if (x<=m)  
				update(nod*2,st,m,ok);
			if (y>m)
				update(nod*2+1,m+1,dr,ok);
		
			if (H[nod*2].lst==m-st+1) 
				H[nod].lst=H[nod*2].lst+H[nod*2+1].lst;
			else
				H[nod].lst=H[nod*2].lst;
		
			if (H[nod*2+1].ldr==dr-m) 
				H[nod].ldr=H[nod*2].ldr+H[nod*2+1].ldr;
			else
				H[nod].ldr=H[nod*2+1].ldr;
				
			H[nod].lint=max(H[2*nod].lint,H[2*nod+1].lint);
			H[nod].lint=max(H[nod].lint,H[2*nod].ldr+H[2*nod+1].lst);
		}
	else 
	{
		if (x<=st && dr<=y) 
		{
			H[nod].lst=H[nod].ldr=H[nod].lint=dr-st+1;
			return;
		}
			
		int m=(st+dr)/2;
			
		if (x<=m)
			update(nod*2,st,m,ok);
		if (y>m)
			update(nod*2+1,m+1,dr,ok);
			
		if (H[nod*2].lst==m-st+1) 
			H[nod].lst=H[nod*2].lst+H[nod*2+1].lst;
		else
			H[nod].lst=H[nod*2].lst;
		
		if (H[nod*2+1].ldr==dr-m) 
			H[nod].ldr=H[nod*2].ldr+H[nod*2+1].ldr;
		else
			H[nod].ldr=H[nod*2+1].ldr;
				
		H[nod].lint=max(H[2*nod].lint,H[2*nod+1].lint);
		H[nod].lint=max(H[nod].lint,H[2*nod].ldr+H[2*nod+1].lst);
			
		
	}
}


void read() 
{
	f=fopen("hotel.in","r");
	g=fopen("hotel.out","w");

	fscanf(f,"%d%d",&n,&p);
	init(1,1,n);
	
	for (i=1;i<=p;i++)
		{
			fscanf(f,"%d",&z);
			switch (z) 
			{
				case 1 : 
					{
						fscanf(f,"%d%d",&x,&y);
						y=x+y-1;
						update(1,1,n,true);
						break;
					}
				case 2 :
					{
						fscanf(f,"%d%d",&x,&y);
						y=x+y-1;
						update(1,1,n,false);
						break;
					}						
				case 3 :
					{
						fprintf(g,"%d\n",H[1].lint);
					}
			}
		}

}

int main() 
{
	read();
	fclose(g);
	return 0;
}