Cod sursa(job #177949)

Utilizator blasterzMircea Dima blasterz Data 13 aprilie 2008 21:22:49
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
using namespace std;
#include <algorithm>
#include <cstdio>
#define maxn 100001
#define common \
	int m=(l+r)>>1, L=n<<1, R=L+1
	
int s[maxn*3], st[maxn*3],dr[maxn*3];
bool fre[maxn*3], full[maxn*3];

int n,m;

inline void build(int n, int l,int r)
{
	if(l==r)
	{
		fre[n]=1;
		full[n]=0;
		st[n]=dr[n]=s[n]=1;
		return;
	}
	
	common;
	
	build(L, l, m);
	build(R, m+1, r);
	
	s[n]=r-l+1;
	st[n]=dr[n]=s[n];
	fre[n]=1;
	full[n]=0;
}

inline void update1(int n,int l, int r, int ql, int qr)
{
	//printf("%d %d %d %d %d\n", n,l, r, ql, qr);
	if(l==ql && r==qr)
	{
		fre[n]=0;
		full[n]=1;
		st[n]=dr[n]=s[n]=0;
		return;
	}
	//if(l>=r)return;
	common;
	
	if(fre[n])
	{
		fre[L]=fre[R]=1;
		st[L]=dr[L]=s[L]=m-l+1;
		st[R]=dr[R]=s[R]=r-(m+1)+1;
		fre[n]=0;
	}
	
	if(ql<=m) update1(L, l, m, ql, min(qr, m));
	if(qr>m)  update1(R, m+1, r, max(ql, m+1), qr);
	
	if(fre[L] && fre[R]) fre[n]=1;
	if(full[L] && full[R]) full[n]=1;
	st[n]=st[L];
	if(fre[L]) st[n]+=st[R];
	dr[n]=dr[R];
	if(fre[R]) dr[n]+=dr[L];
	s[n]=max(s[L], max(s[R], dr[L]+st[R]));
	s[n]=max(s[n], max(st[n], dr[n]));
	
}

inline void update2(int n, int l, int r, int ql,int qr)
{
//	printf("%d %d %d %d %d\n",n,l, r, ql, qr);
	if(ql==l && qr==r)
	{
		fre[n]=1;
		full[n]=0;
		st[n]=dr[n]=s[n]=r-l+1;
		return;
	}
	//if(l>=r)return;
	common;
	
	if(full[n])
	{
		full[L]=full[R]=1;
		st[L]=st[R]=dr[L]=dr[R]=s[L]=s[R]=0;
		full[n]=0;
	}
	
	if(ql<=m) update2(L, l, m, ql, min(qr, m));
	if(qr>m)  update2(R, m+1, r, max(ql, m+1), qr);
	
	if(fre[L] && fre[R]) fre[n]=1;
	if(full[L] && full[R]) full[n]=1;
	st[n]=st[L];
	if(fre[L]) st[n]+=st[R];
	dr[n]=dr[R];
	if(fre[R]) dr[n]+=dr[L];
	s[n]=max(s[L], max(s[R], dr[L]+st[R]));
	s[n]=max(s[n], max(st[n], dr[n]));
	
}

inline int query()
{
	return s[1];
}


int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	scanf("%d %d\n", &n, &m);
	build(1, 1, n);
	int t, p, q;
//	for(int i=1;i<=2*n;++i)printf("%d ", s[i]);
	//printf("\n");
	
	while(m--)
	{
		
		scanf("%d ", &t);
		//printf("%d\n", t);
		if(t==1)
		{
			scanf("%d %d\n", &p, &q);
			update1(1, 1, n, p, p+q-1);
		}
		if(t==2)
		{
			scanf("%d %d\n", &p, &q);
			//printf("__%d %d__\n", p, p+q-1);
			update2(1, 1, n, p, p+q-1);
		}
		if(t==3)
		{
			printf("%d\n", query());
		}
		
		//for(int i=1;i<=2*n;++i)printf("%d ", s[i]);
		//printf("\n");
	}
	
	return 0;
}