Cod sursa(job #771502)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 26 iulie 2012 09:44:08
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<iostream>
#include<fstream>
using namespace std;
int s[400001],l[400001],r[400001],d[400001],a,b,val;
int maxim(int a, int b)
{
	if(a>=b)
		return a;
	return b;
}
void built(int nod, int st, int dr)
{
	int mij;
	s[nod]=dr-st+1;
	l[nod]=s[nod];
	r[nod]=s[nod];
	d[nod]=-1;
	if(st==dr) 
		return ;
	mij=(st+dr)/2;
	built(nod*2,st,mij);
	built(nod*2+1,mij+1,dr);
}
void update(int nod, int st, int dr)
{
	int mij;
	if((a<=st)&&(dr<=b)) {
		d[nod]=val;
		s[nod]=(dr-st+1)*val;
		l[nod]=s[nod];
		r[nod]=s[nod];
		return ;
	}
	mij=(st+dr)/2;
	if(d[nod]!=-1) {
		d[nod*2]=d[nod];
		s[nod*2]=(mij-st+1)*d[nod];
		l[nod*2]=s[nod*2];
		r[nod*2]=s[nod*2];
		d[nod*2+1]=d[nod];
		s[nod*2+1]=(dr-mij)*d[nod];
		l[nod*2+1]=s[nod*2+1];
		r[nod*2+1]=s[nod*2+1];
		d[nod]=-1;
	}
	if(a<=mij)
		update(2*nod,st,mij);
	if(mij<b)
		update(2*nod+1,mij+1,dr);
 	s[nod]=maxim(r[2*nod]+l[2*nod+1],maxim(s[nod*2],s[nod*2+1]));
	r[nod]=r[nod*2+1];
	if(r[nod*2+1]==(dr-mij) && r[nod]<(r[nod*2+1]+r[nod*2]))
		r[nod]=r[nod*2+1]+r[nod*2];
	l[nod]=l[nod*2];
	if(l[nod*2]==(mij-st+1) && l[nod]<(l[nod*2]+l[nod*2+1]))
		l[nod]=l[nod*2]+l[nod*2+1];
}
int main ()
{
	int n,i,opt,p;
	ifstream f("hotel.in");
	ofstream g("hotel.out");
	f>>n>>p;
	built(1,1,n);
	for(i=1;i<=p;i++) {
		f>>opt;
		if(opt==1) {
			f>>a>>b;
			b=a+b-1;
			val=0;
			update(1,1,n);
		}
		else if(opt==2) {
			f>>a>>b;
			b=a+b-1;
			val=1;
			update(1,1,n);
		}
		else g<<s[1]<<'\n';
	}
	f.close();
	g.close();
	return 0;
}