Cod sursa(job #571586)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 4 aprilie 2011 16:51:39
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<cstdio>
#include<algorithm>
#define Nmax 300000
using namespace std;

int N,P,A,B,val;

struct arbore{
	int st;
	int dr;
	int m;
} a[Nmax];

void init(int nod,int st,int dr){
	
	if(st==dr){
		a[nod].st=a[nod].dr=a[nod].m=1;
		return;
	}
	
	int mij=(st+dr)/2;
	
	init(2*nod,st,mij);
	init(2*nod+1,mij+1,dr);
	
	a[nod].st=a[nod].dr=a[nod].m=a[2*nod].m+a[2*nod+1].m;
}
void update(int nod,int st,int dr){
	
	if(A <=st && dr<=B){
		if(val==0)
		a[nod].st=a[nod].dr=a[nod].m=val;
		else a[nod].st=a[nod].dr=a[nod].m=dr-st+1;
		return;
	}
	
	int mij=(st+dr)/2;
	
	if(a[nod].m == 0 ){ //daca am sters anterior intervalul [st,dr]
		a[2*nod].m=a[2*nod].st=a[2*nod].dr=0; //stergem copiii acestuia
		a[2*nod+1].m=a[2*nod+1].st=a[2*nod+1].dr=0;
	}
	
	if(A<=mij) update(nod*2,st,mij);
	if(B>mij) update(nod*2+1,mij+1,dr);
	
	a[nod].st=a[2*nod].st;
	a[nod].dr=a[2*nod+1].dr;
	
	if(a[nod].st == mij-st+1 ) //daca tot intervalul din stanga este plin
		a[nod].st += a[2*nod+1].st;
	
	if(a[nod].dr == dr-mij) //daca tot intervalul din dreapta este plin
		a[nod].dr += a[2*nod].dr;
	
	a[nod].m=max(a[nod].st,a[nod].dr);
	a[nod].m = max( max(a[nod].m,a[2*nod].dr+a[2*nod+1].st), max(a[2*nod].m,a[2*nod+1].m) );
}
int main(){
	
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	
    scanf("%d%d",&N,&P);
	init(1,1,N);
	
	for(;P;--P){
		
		int tip;
		scanf("%d",&tip);
		
		switch(tip){
			
		case 3:
			printf("%d\n",a[1].m);
			break;
			
		default: 
			val=tip-1;
			scanf("%d%d",&A,&B);
			B+=A-1;
			update(1,1,N);
			break;}
	}
return 0;
}