Cod sursa(job #1202937)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 30 iunie 2014 10:30:35
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("hotel.in");
ofstream o("hotel.out");
struct camera{
	bool dr,st;
	int nr,l,r;
	camera(){
		dr = st = false;
		nr = l = r = 0;
	}
};
camera a[400004];
int n,p;

void update(int l,int r,int v,int nod,int q=1,int p=n){
	if(p==q){
	   	a[nod].l = a[nod].r = a[nod].nr = a[nod].dr = a[nod ].st=v;
		return;	
	}
	int m = (p+q)/2;
	if(m>=l)update(l,r,v,nod*2,q,m);
	if(m+1<=r)update(l,r,v,nod*2+1,m+1,p);
	
	a[nod].nr =  max(a[nod*2].nr,max(a[nod*2+1].nr,a[nod*2].r+a[nod*2+1].l));
	if(a[nod*2+1].dr){
		a[nod].dr  = 1;
		if(a[nod*2+1].st && a[nod*2].dr && a[nod*2+1].r+a[nod*2+1].l==a[nod*2+1].nr*2) a[nod].r = a[nod*2+1].r+a[nod*2].r;
		else a[nod].r = a[nod*2+1].r;
	}else a[nod].dr = a[nod].r = 0;
	
	if(a[nod*2].st){
		a[nod].st  = 1;
		if(a[nod*2+1].st && a[nod*2].dr && a[nod*2].l + a[nod*2].r == 2*a[nod*2].nr) a[nod].l = a[nod*2+1].l+a[nod*2].r;
		else a[nod].l = a[nod*2].l;
	}else a[nod].st = a[nod].l = 0;
}


int main(){
	f>>n>>p;
	update(1,n,1,1,1,n);
//	o<<a[1].nr;
	
	int x,y,z;
	for(int i=1;i<=p ;i++){
		f>>x;
		if(x==1){
			f>>y>>z;
			update(y,y-1+z,0,1);
		}else if(x==2){
			f>>y>>z;
			update(y,y-1+z,1,1);
		}else{
			o<<a[1].nr<<"\n";
		}
	}
}