Cod sursa(job #532969)

Utilizator feelshiftFeelshift feelshift Data 12 februarie 2011 20:07:32
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
// http://infoarena.ro/problema/hotel
#include <fstream>
#include <cmath>
using namespace std;

#define maxSize 100002
#define leftSon 2*node
#define rightSon 2*node+1

#define begin first
#define end second

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

struct leaf {
	bool status;
	pair<int,int> interval;
};

int value;
int currentLenght,maxLenght;
pair<int,int> interval;
leaf tree[262144];

void update(int node,int left,int right);
void findSubsequence(int node,int left,int right);

int main() {
	int rooms,instructions,type;

	in >> rooms >> instructions;
	for(int i=1;i<=instructions;i++) {
		in >> type;

		switch(type) {
			case 1:
				in >> interval.begin >> interval.end;
				interval.end = interval.begin + interval.end - 1;
				update(1,1,rooms);

				break;
			case 2:
				in >> interval.begin >> interval.end;
				interval.end = interval.begin + interval.end - 1;
				update(1,1,rooms);

				break;
			case 3:
				//findSubsequence(1,1,rooms);
				out << maxLenght << "\n";
				currentLenght = 0;
				maxLenght = 0;
				break;
		}
	}

	return (0);
}

void update(int node,int left,int right) {
	if(left == right) {
		tree[node].status= !tree[node].status;

		return;
	}
	else {
		int middle = (left + right) / 2;

		if(interval.begin <= middle)
			update(leftSon,left,middle);

		if(interval.end > middle)
			update(rightSon,middle+1,right);
	}

	//tree[node] = max(tree[leftSon],tree[rightSon]);
}

void findSubsequence(int node,int left,int right) {
	if(left == right)	// daca este un interval elementar
		if(!tree[node].status) {
			currentLenght++;
			maxLenght = max(maxLenght,currentLenght);
		}
		else
			currentLenght = 0;
	else {
		int middle = (left + right) / 2;

		findSubsequence(leftSon,left,middle);
		findSubsequence(rightSon,middle+1,right);
	}

}