Cod sursa(job #728387)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 28 martie 2012 18:06:38
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream in("hotel.in");
ofstream out("hotel.out");

const int N = 100010;

int n,m,aint[3*N], pref[3*N], suf[3*N], x, y;

void init(int nod, int pozx, int pozy) {
	
	aint[nod] = pref[nod] = suf[nod] = pozy - pozx + 1;
	
	if(pozx==pozy)
		return;
	
	int mi = (pozx + pozy)>>1;
	
	init(2*nod, pozx, mi);
	init(2*nod + 1, mi+1, pozy);
}

void update1(int nod, int pozx, int pozy) {
	if(pozx>=x && pozy<=y) {
		aint[nod] = pref[nod] = suf[nod] = 0;
		return;
	}
	
	int mi = (pozx + pozy)>>1;
	
	if(mi>=x)
		update1(2*nod, pozx, mi);
	if(mi<y)
		update1(2*nod+1, mi + 1, pozy);
	
	pref[nod] = pref[2*nod];
	if(pref[2*nod] == mi - pozx+1)
		pref[nod] += pref[2*nod+1];
	
	suf[nod] = suf[2*nod+1];
	if(suf[2*nod+1] == pozy - mi)
		suf[nod] += suf[2*nod];
	
	aint[nod] = max(aint[2*nod], max(aint[2*nod+1], suf[2*nod] + pref[2*nod+1]));
}

void update2(int nod, int pozx, int pozy) {
	if(pozx>=x && pozy<=y) {
		aint[nod] = pref[nod] = suf[nod] = pozy - pozx + 1;
		return;
	}
	
	int mi = (pozx + pozy)>>1;
	
	if(aint[nod] == 0) {
		aint[2*nod] = 0; pref[2*nod] = 0; suf[2*nod] = 0;
		aint[2*nod+1] = 0; pref[2*nod+1] = 0; suf[2*nod + 1] = 0;
	}
	
	if(mi>=x)
		update2(2*nod, pozx, mi);
	if(mi<y)
		update2(2*nod+1, mi+1, pozy);
	
	pref[nod] = pref[2*nod];
	if(pref[2*nod] == mi - pozx+1)
		pref[nod] += pref[2*nod+1];
	
	suf[nod] = suf[2*nod+1];
	if(suf[2*nod+1] == pozy - mi)
		suf[nod] += suf[2*nod];
	
	aint[nod] = max(aint[2*nod], max(aint[2*nod+1], suf[2*nod] + pref[2*nod+1]));
}

int main() {
	int i,op;
	
	in >> n >> m;
	
	init(1,1,n);
	
	for(i=1;i<=m;++i) {
		in >> op;
		
		if(op==1) {
			in >> x >> y;
			y+=x-1;
			update1(1,1,n);
		}
		if(op==2) {
			in >> x >> y;
			y+=x-1;
			update2(1,1,n);
		}
		if(op==3)
			out << aint[1] << "\n";
	}
	
	return 0;
}