Cod sursa(job #180235)

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

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


//    if(st[L]==m-l+1 && st[R]==r-(m+1)+1) s[n]=st[n]=dr[n]=r-l+1;
  //  else
    {

    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);
	    // for(i=p;i<p+q;++i)
	//	update1(1, 1, n, i);
	}

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

	
    }

    return 0;
}