Cod sursa(job #180216)

Utilizator blasterzMircea Dima blasterz Data 16 aprilie 2008 19:28:59
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
using namespace std;
#include <algorithm>
#include <cstdio>
#include <string>
#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];

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

    if(p<=m) update1(L, l, m, p);
    else update1(R, m+1, r, p);

    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 p)
{
    if(l==r)
    {
	s[n]=st[n]=dr[n]=1;
	return ;
    }
    common;

    if(p<=m) update2(L, l, m, p);
    else update2(R, m+1, r, p);

    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]));

}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    int n, m,i, t, p, q;
    scanf("%d %d\n", &n, &m);

    for(i=1;i<=n;++i) update2(1, 1, n, i);
    while(m--)
    {
	scanf("%d ", &t);

	if(t==1)
	{
	    scanf("%d %d\n", &p, &q);
	    for(i=p;i<p+q;++i)
		update1(1, 1, n, i);
	}

	if(t==2)
	{
	    scanf("%d %d\n", &p, &q);
	    for(i=p;i<p+q;++i)
		update2(1, 1, n, i);
	}
    
	if(t==3)
	    printf("%d\n", s[1]);

	
    }

    return 0;
}