Cod sursa(job #563182)

Utilizator cdascaluDascalu Cristian cdascalu Data 24 martie 2011 17:27:12
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<fstream>
#define MAX 262144
using namespace std;
int N,P,l,r,c;
struct bla
{
	int l,r,c;
}ARB[MAX];
void init(int nod,int left,int right)
{
	ARB[nod].r = ARB[nod].l = ARB[nod].c = right-left+1;
	if(left>=right)return;
	
	int mid = (left+right)/2;
	
	init(2*nod,left,mid);
	init(2*nod+1,mid+1,right);
}
int maxim(int a,int b,int c)
{
	if(a>=b&&a>=c)
		return a;
	if(b>=c)
		return b;
	return c;
}
void update(int nod,int left,int right)
{
	if(l<=left && right<=r)
	{
		ARB[nod].l = ARB[nod].r = ARB[nod].c = c*(right-left+1);
		
		return;
	}
	if(left>=right)return;
	
	if(ARB[nod].c == 0)
	{
		ARB[nod*2].l = ARB[nod*2].r = ARB[2*nod].c = 0;
		ARB[nod*2+1].l = ARB[nod*2+1].r = ARB[nod*2+1].c = 0;
	}
	
	int mid = (left	+ right)/2;
	
	if(ARB[nod].c == right-left+1)
	{
		ARB[nod*2].l = ARB[nod*2].r = ARB[2*nod].c = mid-left+1;
		ARB[nod*2+1].l = ARB[nod*2+1].r = ARB[nod*2+1].c = right-mid;
	}
	
	if(l<=mid)
		update(2*nod, left, mid);
	if(mid<r)
		update(2*nod+1, mid+1, right);
	
	ARB[nod].l = ARB[nod*2].l;
	if(ARB[nod*2].l == mid-left+1)
		ARB[nod].l+=ARB[nod*2+1].l;
	
	ARB[nod].r = ARB[nod*2+1].r;
	if(ARB[nod*2+1].r == right-mid)
		ARB[nod].r+=ARB[nod*2].r;
	
	ARB[nod].c = maxim(ARB[nod*2].c, ARB[nod*2+1].c, ARB[nod*2].r + ARB[nod*2+1].l);
}
int main()
{
	ifstream f("hotel.in");
	f>>N>>P;
	init(1,1,N);
	ofstream g("hotel.out");
	while(P--)
	{
		f>>c;
		if(c==1 || c==2)
		{
			if(c==1)c=0;
			if(c==2)c=1;
			
			f>>l>>r;
			r+=(l-1);
			update(1,1,N);
		}
		else g<<ARB[1].c<<"\n";
	}
	f.close();
	g.close();
	return 0;
}