Cod sursa(job #735360)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 16 aprilie 2012 11:23:08
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include<iostream>
#include<fstream>
using namespace std;
struct arb {
	int val,c,st,dr;
};
arb v[400001];
int a,b,j;
void construieste(int nod, int st, int dr)
{
	int mij;
	if(st==dr) {
		v[nod].c=2;
		v[nod].val=1;
		v[nod].st=1;
		v[nod].dr=1;
		return;
	}
	mij=(st+dr)/2;
	construieste(nod*2,st,mij);
	construieste(nod*2+1,mij+1,dr);
	v[nod].c=2;
	v[nod].val=dr-st+1;
	v[nod].st=dr-st+1;
	v[nod].dr=dr-st+1;
}
void update1(int nod, int st, int dr)
{
	int mij;
	if((a<=st)&&(dr<=b)) {
		v[nod].c=1;
		v[nod].val=0;
		v[nod].st=0;
		v[nod].dr=0;
		return;
	}
	mij=(st+dr)/2;
	if(v[nod].c==1) {
		v[nod*2].c=1;
		v[nod*2].val=0;
		v[nod*2].st=0;
		v[nod*2].dr=0;
		v[nod*2+1].c=1;
		v[nod*2+1].val=0;
		v[nod*2+1].st=0;
		v[nod*2+1].dr=0;
	}
	else if(v[nod].c==0) {
		v[nod*2].c=0;
		v[nod*2].val=mij-st+1;
		v[nod*2].st=mij-st+1;
		v[nod*2].dr=mij-st+1;
		v[nod*2+1].c=1;
		v[nod*2+1].val=dr-mij;
		v[nod*2+1].st=dr-mij;
		v[nod*2+1].dr=dr-mij;
	}
	v[nod].c=2;
	if(a<=mij) 
		update1(nod*2,st,mij);
	if(mij<b)
		update1(nod*2+1,mij+1,dr);
	v[nod].val=v[nod*2].val;
	if(v[nod].val<v[nod*2+1].val)
		v[nod].val=v[nod*2+1].val;
	if(v[nod].val<v[nod*2].dr+v[nod*2+1].st)
		v[nod].val=v[nod*2].dr+v[nod*2+1].st;
	if(v[nod*2].st) {
		v[nod].st=v[nod*2].st;
		if((mij-st+1)==v[nod*2].st)
			v[nod].st=v[nod].st+v[nod*2+1].st;
	}
	else v[nod].st=0;
	if(v[nod*2+1].dr) {
		v[nod].dr=v[nod*2+1].dr;
		if((dr-mij)==v[nod*2+1].dr)
			v[nod].dr=v[nod].dr+v[nod*2].dr;
	}
	else v[nod].dr=0;;
}
void update(int nod, int st, int dr)
{
	int mij;
	if((a<=st)&&(dr<=b)) {
		v[nod].c=0;
		v[nod].val=dr-st+1;
		v[nod].st=dr-st+1;
		v[nod].dr=dr-st+1;
		return;
	}
	mij=(st+dr)/2;
	if(v[nod].c==1) {
		v[nod*2].c=1;
		v[nod*2].val=0;
		v[nod*2].st=0;
		v[nod*2].dr=0;
		v[nod*2+1].c=1;
		v[nod*2+1].val=0;
		v[nod*2+1].st=0;
		v[nod*2+1].dr=0;
	}
	else if(v[nod].c==0) {
		v[nod*2].c=0;
		v[nod*2].val=mij-st+1;
		v[nod*2].st=mij-st+1;
		v[nod*2].dr=mij-st+1;
		v[nod*2+1].c=1;
		v[nod*2+1].val=dr-mij;
		v[nod*2+1].st=dr-mij;
		v[nod*2+1].dr=dr-mij;
	}
	v[nod].c=2;
	mij=(st+dr)/2;
	if(a<=mij) 
		update(nod*2,st,mij);
	if(mij<b)
		update(nod*2+1,mij+1,dr);
	v[nod].val=v[nod*2].val;
	if(v[nod].val<v[nod*2+1].val)
		v[nod].val=v[nod*2+1].val;
	if(v[nod].val<v[nod*2].dr+v[nod*2+1].st)
		v[nod].val=v[nod*2].dr+v[nod*2+1].st;
	if(v[nod*2].st) {
		v[nod].st=v[nod*2].st;
		if((mij-st+1)==v[nod*2].st)
			v[nod].st=v[nod].st+v[nod*2+1].st;
	}
	else v[nod].st=0;
	if(v[nod*2+1].dr) {
		v[nod].dr=v[nod*2+1].dr;
		if((dr-mij)==v[nod*2+1].dr)
			v[nod].dr=v[nod].dr+v[nod*2].dr;
	}
	else v[nod].dr=0;
}
int main ()
{
	int n,i,p,x,j;
	ifstream f("hotel.in");
	ofstream g("hotel.out");
	f>>n>>p;
	construieste(1,1,n);
	for(i=1;i<=p;i++) {
		f>>x;
		if(x==1) {
			f>>a>>b;
			b=a+b-1;
			update1(1,1,n);
		}
		else if(x==2) {
			f>>a>>b;
			b=a+b-1;
			update(1,1,n);
		}
		else g<<v[1].val<<'\n';
	}
	f.close();
	g.close();
	return 0;
}