Cod sursa(job #595425)

Utilizator maritimCristian Lambru maritim Data 12 iunie 2011 16:40:05
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<stdio.h>

#define MaxN 1000100
#define sum dr - st + 1
#define lf (2 * nod)
#define rf (2 * nod) + 1
#define mij (st + dr) / 2

int AIC[MaxN];
int AIL[MaxN];
int AIR[MaxN];
int N;
int P;
int stare;
int a;
int b;

int max(int a,int b)
{
	return a>b ? a:b;
}

void build(int nod,int st,int dr)
{
	AIC[nod] = sum;
	AIL[nod] = sum;
	AIR[nod] = sum;
	if(st < dr)
	{
		build(lf , st , mij);
		build(rf , mij + 1 , dr);
	}
}

int update(int nod,int st,int dr,int a,int b,int v)
{
	if(st == dr)
	{
		AIC[nod] = v;
		AIL[nod] = v;
		AIR[nod] = v;
		return 0;
	}
	if(a <= mij && b >= st)
		update(lf , st , mij , a , b , v);
	if(b > mij && a <= dr)
		update(rf , mij + 1 , dr , a , b , v);
	AIC[nod] = max(max(AIC[lf] , AIC[rf]) , AIR[lf] + AIL[rf]);
	if(AIR[rf] && AIR[rf] == AIL[rf])
		AIR[nod] = AIR[lf] + AIR[rf];
	else
		AIR[nod] = AIR[rf];
	if(AIL[lf] && AIL[lf] == AIR[lf])
		AIL[nod] = AIL[lf] + AIL[rf];
	else
		AIL[nod] = AIL[lf];
}

int main()
{
	FILE *f = fopen("hotel.in","r");
	FILE *g = fopen("hotel.out","w");
	
	fscanf(f,"%d %d",&N,&P);
	build(1,1,N);
	for(int i=1;i<=P;i++)
	{
		fscanf(f,"%d ",&stare);
		if(stare < 3)
		{
			fscanf(f,"%d %d",&a,&b);
			update(1,1,N,a,a+b-1,1-stare%2);
		}
		else
			fprintf(g,"%d\n",AIC[1]);
	}
	
	fclose(g);
	fclose(f);
}