Cod sursa(job #1364893)

Utilizator ooptNemes Alin oopt Data 27 februarie 2015 21:14:58
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
// hotel
#include <iostream>
#include <fstream>
#include <algorithm>

#define NMax 100005

using namespace std;

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

int n,q;
int p,m;
int L[6 * NMax];
int R[6 * NMax];
int A[6 * NMax];
int rooms, roomf; // camera de inceput si camera de final pe care vin turisti
/// m = turistii care vin

void update(int nod, int left, int right, int val) {
	if (rooms <= left && right <= roomf) {
		A[nod] = L[nod] = R[nod] = val*(right-left+1);
		return;
	}

	int mid = (left+right)/2;
	if (A[nod] == 0) {
        A[2*nod] = L[2*nod] = R[2*nod] = 0;
        A[2*nod+1] = L[2*nod+1] = R[2*nod+1] = 0;
    } else if (A[nod] == right - left + 1) {
        A[2*nod]=L[2*nod]=R[2*nod]=mid-left+1;
        A[2*nod+1]=L[2*nod+1]=R[2*nod+1]=right-mid;
    }

	if (rooms <= mid)
		update(2*nod, left, mid, val);
	if (roomf > mid)
		update(2*nod+1, mid+1, right, val);

	if (L[2*nod] == mid-left+1)
		L[nod] = L[2*nod]+L[2*nod+1];
	else
		L[nod] = L[2*nod];
	if (R[2*nod+1] == right-mid)
		R[nod] = R[2*nod]+R[2*nod+1];
	else
		R[nod] = R[2*nod+1];

	A[nod] = max(max(max(A[2*nod], A[2*nod+1]), R[2*nod]+L[2*nod+1]), max(L[nod], R[nod]));
}

void read() {
	f>>n>>q;
	rooms = 1; roomf = n;
	update(1,1,n,1);
	for (int i=1;i<=q;i++) {
		int type; f>>type;
		if (type == 1) {
			f>>p>>m;
			rooms = p;
			roomf = p+m-1;
			update(1,1,n,0);
		} else if (type == 2) {
			f>>p>>m;
			rooms = p;
			roomf = p+m-1;
			update(1,1,n,1);
		} else if (type == 3) {
			// Intrebarea proprietarului
			g<<A[1]<<'\n';
		}
	}
}

int main() {

	read();

	f.close(); g.close();
	return 0;
}