Cod sursa(job #180684)

Utilizator gigi_becaliGigi Becali gigi_becali Data 17 aprilie 2008 13:22:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <cstdio>
#include <cstdlib>
#include <string>
#define N 100001
#define common int m=(l+r)>>1, L=n<<1, R=L+1
struct nod { int s, st, dr;nod(){}; nod(int a){s=a; st=a; dr=a;};}__attribute__ ((packed));

nod a[3*N];

int n, m;

inline int min(int a, int b)
{
    if(a<b)return a;
    return b;
}

inline int max(int a,int b)
{
    if(a>b)return a;
    return b;
}


inline void update1(int n,int l, int r, int ql, int qr)
{   
    if(l==ql && r==qr)
    {
	a[n]=nod(0);
	return ;
    }

    common;

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

    a[n].st=a[L].st;
    if(a[L].st==m-l+1) a[n].st+=a[R].st;
    a[n].dr=a[R].dr;
    if(a[R].dr==r-(m+1)+1) a[n].dr+=a[L].dr;

    a[n].s=max(max(a[L].s, a[R].s), max(a[L].dr+a[R].st, max(a[n].st, a[n].dr)));

}

inline void update2(int n, int l, int r, int ql, int qr)
{
    if(l==ql && r==qr)
    {
	a[n]=nod(r-l+1);
	return;
    }

    common;

    if(a[n].s==0)
    {
	a[L]=a[R]=nod(0);
	a[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);

    a[n].st=a[L].st;
    if(a[L].st==m-l+1) a[n].st+=a[R].st;
    a[n].dr=a[R].dr;
    if(a[R].dr==r-(m+1)+1) a[n].dr+=a[L].dr;

    a[n].s=max(max(a[L].s, a[R].s), max(a[L].dr+a[R].st, max(a[n].st, a[n].dr)));

}




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

    char ax[64], *T;
    update2(1, 1, n, 1, n);
    while(m--)
    {
	//scanf("%d ", &t);
	gets(ax);
	T=strtok(ax, " ");
	t=atoi(T);
	

	if(t==3) printf("%d\n", a[1].s);

	if(t==1)
	{
	    T=strtok(0, " ");
	    p=atoi(T);
	    T=strtok(0, " ");
	    q=atoi(T);

	   // scanf("%d %d\n", &p, &q);
	    update1(1, 1, n, p, p+q-1);
	}

	if(t==2)
	{
	    T=strtok(0, " ");
	    p=atoi(T);
	    T=strtok(0, " ");
	    q=atoi(T);
	    //scanf("%d %d\n", &p, &q);
	    update2(1, 1, n, p, p+q-1);
	}
    }

    return 0;
}