Cod sursa(job #180238)

Utilizator blasterzMircea Dima blasterz Data 16 aprilie 2008 19:47:55
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 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 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]));

}


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,i);
    while(m--)
    {
	scanf("%d ", &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);
	    update2(1, 1, n, p, p+q-1);
	}
    
	if(t==3)
	    printf("%d\n", s[1]);
    }

    return 0;
}