Cod sursa(job #14187)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 8 februarie 2007 13:56:56
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#include<stdio.h>
#define fin "hotel.in"
#define fout "hotel.out"
#define Nmax 1000000
int n,p,a,b,segm[Nmax][4];
FILE *in,*out;

int maxf(int a,int b) { (a>b)?(a):(a=b); return a; }

void insert(int nod,int st,int dr) {
int m,len1,len2;
	if (a<=st && dr<=b) {
		segm[nod][0]=segm[nod][1]=segm[nod][2]=0;
		segm[nod][3]=1;
	}
	else {
		m=(st+dr)/2;

		len2=dr-m;
		len1=m-st+1;

		if (segm[nod][3]==1) {
			segm[nod][3]=0;
			segm[2*nod][0]=0; segm[2*nod][1]=0;
			segm[2*nod][2]=0; segm[2*nod][3]=1;
			
			segm[2*nod+1][0]=0; segm[2*nod+1][1]=0;
			segm[2*nod+1][2]=0; segm[2*nod+1][3]=1;
		}
		if (segm[nod][3]==2) {
			segm[nod][3]=0;
			segm[2*nod][0]=len1; segm[2*nod][1]=len1;
			segm[2*nod][2]=len1; segm[2*nod][3]=2;
			
			segm[2*nod+1][0]=len2; segm[2*nod+1][1]=len2;
			segm[2*nod+1][2]=len2; segm[2*nod+1][3]=2;
		
		}

		if (a<=m) 
			insert(2*nod,st,m);
		if (b>m)
			insert(2*nod+1,m+1,dr);
		
			
		segm[nod][2]=maxf(segm[2*nod][1]+segm[2*nod+1][0],segm[2*nod][2]);
		segm[nod][2]=maxf(segm[nod][2],segm[2*nod+1][2]);
		
		if (segm[2*nod][0]==len1) 
			segm[nod][0]=segm[2*nod][0]+segm[2*nod+1][0];
		else
			segm[nod][0]=segm[2*nod][0];
		
		if (segm[2*nod+1][1]==len2)  
			segm[nod][1]=segm[2*nod+1][1]+segm[2*nod][1];
		else 
			segm[nod][1]=segm[2*nod+1][1];
		
	}
}

void del(int nod,int st,int dr) {
int m,len1,len2;
	if (a<=st && dr<=b) { 
		segm[nod][0]=segm[nod][1]=segm[nod][2]=dr-st+1;
		segm[nod][3]=2;
	}
	else {
		m=(st+dr)/2;
		
		len2=dr-m;
		len1=m-st+1;

		if (segm[nod][3]==1) {
			segm[nod][3]=0;
			segm[2*nod][0]=0; segm[2*nod][1]=0;
			segm[2*nod][2]=0; segm[2*nod][3]=1;
			
			segm[2*nod+1][0]=0; segm[2*nod+1][1]=0;
			segm[2*nod+1][2]=0; segm[2*nod+1][3]=1;
		}
		if (segm[nod][3]==2) {
			segm[nod][3]=0;
			segm[2*nod][0]=len1; segm[2*nod][1]=len1;
			segm[2*nod][2]=len1; segm[2*nod][3]=2;
			
			segm[2*nod+1][0]=len2; segm[2*nod+1][1]=len2;
			segm[2*nod+1][2]=len2; segm[2*nod+1][3]=2;
		}
		
		if (a<=m) 
			del(2*nod,st,m);
		if (b>m)
			del(2*nod+1,m+1,dr);
		
		segm[nod][2]=maxf(segm[2*nod][1]+segm[2*nod+1][0],segm[2*nod][2]);
		segm[nod][2]=maxf(segm[nod][2],segm[2*nod+1][2]);
		
		if (segm[2*nod][0]==len1) 
			segm[nod][0]=segm[2*nod][0]+segm[2*nod+1][0];
		else
			segm[nod][0]=segm[2*nod][0];

		if (segm[2*nod+1][1]==len2)  
			segm[nod][1]=segm[2*nod+1][1]+segm[2*nod][1];
		else 
			segm[nod][1]=segm[2*nod+1][1];
		
	}
}

void init(int nod,int st,int dr) {
int m;
	m=(st+dr)/2;
	segm[nod][0]=segm[nod][1]=segm[nod][2]=dr-st+1;
	if (st!=dr) init(2*nod,st,m);
	if (st!=dr) init(2*nod+1,m+1,dr);
	
}

int main() {
int i,op;
	in=fopen(fin,"r"); out=fopen(fout,"w");

	fscanf(in,"%i%i",&n,&p);
	
	a=1; b=n;

	init(1,1,n);

	for (i=1;i<=p;i++) {
		
		fscanf(in,"%i",&op);
		
		if (op==3) fprintf(out,"%i\n",segm[1][2]);
		
		if (op==1) { 
			
			fscanf(in,"%i%i",&a,&b);

			b+=a-1;
			
			insert(1,1,n);

		}
		
		if (op==2) {

			fscanf(in,"%i%i",&a,&b);

			b+=a-1;
			
			del(1,1,n);
		}
	}
		
	for (i=1;i<=20;++i) 
		printf("%i: %i %i %i\n",i,segm[i][0],segm[i][1],segm[i][2]);
 
	fclose(in); fclose(out);

	return 0;
}