Cod sursa(job #459251)

Utilizator blasterzMircea Dima blasterz Data 28 mai 2010 17:35:37
Problema Hotel Scor 100
Compilator cpp Status done
Runda dedicatie_speciala4 Marime 2.33 kb
using namespace std;
#include <algorithm>
#include <cstdio>
#include <string>
#define maxn 100001
#define DIM (1<<13)
#define common \
    int m=(l+r)>>1, L=n<<1, R=L+1

	
char ax[DIM];
int poz;
int s[maxn*3], st[maxn*3], dr[maxn*3];

inline void cit(int &x)
{
	x=0;
	
	while(ax[poz]<'0' || ax[poz]>'9')
	{
		++poz;
		if(poz==DIM) fread(ax, 1, DIM, stdin), poz=0;
	}
	
	while(ax[poz]>='0' &&ax[poz]<='9')
	{
		x=x*10+ax[poz]-'0';
		++poz;
		if(poz==DIM) fread(ax, 1, DIM, stdin), poz=0;
	}
}

inline void update1(int n, int l, int r, int ql, int qr)
{
    if(l==ql && r==qr)
    {
	s[n]=st[n]=dr[n]=0;
	return ;
    }
    common;

    if(s[n]==r-l+1)
    {
	s[L]=st[L]=dr[L]=m-l+1;	
	s[R]=st[R]=dr[R]=r-(m+1)+1;
	s[n]=dr[n]=st[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);

    st[n]=st[L];
    if(st[L]==m-l+1) st[n]+=st[R];
    dr[n]=dr[R];
    if(dr[R]==r-(m+1)+1) 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)
{
    if(l==ql && qr==r)
    {
	s[n]=st[n]=dr[n]=r-l+1;
	return ;
    }
    common;

   
    if(s[n]==0)
    {
	s[L]=s[R]=st[L]=st[R]=dr[L]=dr[R]=0;
	s[n]=r-l+1;
    }

    if(ql<=m) update2(L, l, m, ql, min(qr, m));
    if(qr>m)  update2(R, m+1, r, max(ql, m+1), qr);

    st[n]=st[L];
    if(st[L]==m-l+1) st[n]+=st[R];
    dr[n]=dr[R];
    if(dr[R]==r-(m+1)+1) 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 scrie(int x)
{
	char lin[30], *s;
	s=lin+29; s[0]=0;
	do{
		int cat=x/10;
		--s;
		s[0]=x-cat*10+'0';
		x=cat;
	}while(x);
	puts(s);
}


int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);

    int n, m,i, t, p, q;
	cit(n); cit(m);
	//    scanf("%d %d\n", &n, &m);

    update2(1, 1, n, 1,n);
    while(m--)
    {
		cit(t);
	//scanf("%d ", &t);

	if(t==1)
	{
		cit(p);cit(q);
	  //  scanf("%d %d\n", &p, &q);
	    update1(1, 1, n, p, p+q-1);
	}

	if(t==2)
	{
		cit(p);cit(q);
	    //scanf("%d %d\n", &p, &q);
	    update2(1, 1, n, p, p+q-1);
	}
    
	if(t==3)
		scrie(s[1]);
		//    printf("%d\n", s[1]);
    }

    return 0;
}