Cod sursa(job #955921)

Utilizator Marius96Marius Gavrilescu Marius96 Data 1 iunie 2013 20:35:26
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>

#define MULT 100000
#define iszero(x) (tmax[x]==amax[x])
#define max(a,b) ((a)<(b)?(b):(a))

static int tstanga[MULT*17], tdreapta[MULT*17], tmax[MULT*17], amax[MULT*17], lazy[MULT*17];

void update(int n, int s, int e, int a, int b, int v)
{
	if(s>=a && b>=e){
		tstanga[n]=tdreapta[n]=tmax[n]=v?0:e-s+1;
		lazy[n]=v+1;
		return;
	}

	int m=(s+e)/2;
	if(lazy[n]){
		update(2*n  , s  , m, s  , m, lazy[n]-1);
		update(2*n+1, m+1, e, m+1, e, lazy[n]-1);
		lazy[n]=0;
	}

	if(a<=m)
		update(2*n  , s  , m, a, b, v);
	if(b>m)
		update(2*n+1, m+1, e, a, b, v);

	if(iszero(2*n))
		tstanga[n]=tstanga[2*n]+tstanga[2*n+1];
	else
		tstanga[n]=tstanga[2*n];

	if(iszero(2*n+1))
		tdreapta[n]=tdreapta[2*n+1]+tdreapta[2*n];
	else
		tdreapta[n]=tdreapta[2*n+1];

	tmax[n]=max(max(tdreapta[2*n]+tstanga[2*n+1], tmax[2*n]), tmax[2*n+1]);
}

void init(int n, int s, int e)
{
	tstanga[n]=tdreapta[n]=tmax[n]=amax[n]=e-s+1;
	if(s!=e){
		int m=(s+e)/2;
		init(2*n  , s  , m);
		init(2*n+1, m+1, e);
	}
}

int main(void)
{
	freopen("hotel.in","r",stdin);
#ifdef INFOARENA
	freopen("hotel.out","w",stdout);
#endif

	int n, p;
	scanf("%d%d",&n,&p);
	init(1,1,n);
	while(p--){
		int op;
		scanf("%d",&op);
		int a,b;
		if(op!=3)
			scanf("%d%d",&a,&b);
		b=a+b-1;

		switch(op){
		case 1:
			update(1,1,n,a,b,1);
			break;
		case 2:
			update(1,1,n,a,b,0);
			break;
		case 3:
			printf("%d\n",tmax[1]);
		}
	}

	return 0;
}