Cod sursa(job #726497)

Utilizator fhandreiAndrei Hareza fhandrei Data 27 martie 2012 11:47:42
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
//Include
#include <fstream>
using namespace std;

//Definitii
#define leftSon node<<1
#define rightSon (node<<1)+1

//Constante
const int MAX_SIZE = (int)1e5+1;

//Structuri
struct
{
	int val;
	int left;
	int right;
	int camera;
	
} tree[MAX_SIZE<<2];

//Functii
void update(int node, int left, int right);
void expand(int node, int left, int right);

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

int nrCamere, nrOperatii;
int question;
int intervalLeft, intervalRight, type;

//Main
int main()
{
	in >> nrCamere >> nrOperatii;
	
	tree[1].camera = -1;
	expand(1, 1, nrCamere);
	while(nrOperatii--)
	{
		in >> question;
		switch(question)
		{
			case 1:
			{
				in >> intervalLeft >> intervalRight;
				intervalRight += intervalLeft - 1;
				type = 1;
				update(1, 1, nrCamere);
				break;
			}
			case 2:
			{
				in >> intervalLeft >> intervalRight;
				intervalRight += intervalLeft - 1;
				type = -1;
				update(1, 1, nrCamere);
				break;
			}
			default:
				out << tree[1].val << '\n';
		}
	}
	
	in.close();
	out.close();
	return 0;
}

void update(int node, int left, int right)
{
	if(intervalLeft <= left && right <= intervalRight)
	{
		tree[node].camera = type;
		expand(node, left, right);
		return;
	}
	
	expand(node, left, right);
	int mid = (left + right)>>1;
	
	if(intervalLeft <= mid)
		update(leftSon, left, mid);
	if(mid < intervalRight)
		update(rightSon, mid+1, right);
	
	expand(leftSon, left, mid);
	expand(rightSon, mid+1, right);
	
	int max1 = max(tree[leftSon].val, tree[rightSon].val);
	int max2 = tree[leftSon].right + tree[rightSon].left;
	tree[node].val = max(max1, max2);
	
	tree[node].left = (tree[leftSon].val == mid-left+1)? (tree[leftSon].val + tree[rightSon].left) : (tree[leftSon].left);
	tree[node].right = (tree[rightSon].val == right-mid)? (tree[rightSon].val + tree[leftSon].right) : (tree[rightSon].right);
	
}


void expand(int node, int left, int right)
{
	if(tree[node].camera)
	{
		if(tree[node].camera == 1)
			tree[node].val = tree[node].left = tree[node].right = 0;
		else
			tree[node].val = tree[node].left = tree[node].right = right - left + 1;
		if(left != right)
			tree[leftSon].camera = tree[rightSon].camera = tree[node].camera;
		tree[node].camera = 0;
	}
}