Cod sursa(job #887212)

Utilizator stoicatheoFlirk Navok stoicatheo Data 23 februarie 2013 16:52:14
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<stdio.h>
#define Ni 262144
#define abs(a) ((a)<0?-(a):(a))
#define max(a,b) ((a)>(b)?(a):(b))
int Max[Ni],Maxl[Ni],Maxr[Ni],Up[Ni],Down[Ni];

void setintervals(int n, int l, int r)
{
    Max[n]=Maxl[n]=Maxr[n]=r-l+1;
    if(l<r)
    {
        int m=(l+r)>>1;

        setintervals(n<<1,l,m);
        setintervals(n<<1|1,m+1,r);
    }
}

void update(int n, int l, int r, int a, int b, int i, int up)
{
    if(a<=l && r<=b)
    {
        Up[n]=i;
        if(i>0)
            Max[n]=Maxl[n]=Maxr[n]=0;
        else
            Max[n]=Maxl[n]=Maxr[n]=r-l+1;
    }
    else
    {
        int m=(l+r)>>1,mup;

        mup=abs(up)>abs(Up[n<<1])?up:Up[n<<1];
        if(a<=m)
            update(n<<1,l,m,a,b,i,mup);
        else
            if(abs(mup)>Down[n<<1])
                if(mup>0)
                    Max[n<<1]=Maxl[n<<1]=Maxr[n<<1]=0;
                else
                    Max[n<<1]=Maxl[n<<1]=Maxr[n<<1]=m-l+1;

        mup=abs(up)>abs(Up[n<<1|1])?up:Up[n<<1|1];
        if(b>m)
            update(n<<1|1,m+1,r,a,b,i,mup);
        else
            if(abs(mup)>Down[n<<1|1])
                if(mup>0)
                    Max[n<<1|1]=Maxl[n<<1|1]=Maxr[n<<1|1]=0;
                else
                    Max[n<<1|1]=Maxl[n<<1|1]=Maxr[n<<1|1]=r-m;

        Down[n]=abs(i);
        if(Max[n<<1]>Max[n<<1|1])
            Max[n]=Max[n<<1];
        else
            Max[n]=Max[n<<1|1];
        Max[n]=max(Max[n],Maxr[n<<1]+Maxl[n<<1|1]);
        Maxl[n]=Maxl[n<<1];
        if(Maxl[n]==m-l+1)
            Maxl[n]+=Maxl[n<<1|1];
        Maxr[n]=Maxr[n<<1|1];
        if(Maxr[n]==r-m)
            Maxr[n]+=Maxr[n<<1];
    }
}

int main()
{
    int n,m,i,t,a,b;

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

    scanf("%d%d",&n,&m);
    setintervals(1,1,n);

    for(i=1;i<=m;++i)
    {
        scanf("%d",&t);
        if(t<3)
        {
            scanf("%d%d",&a,&b);
            update(1,1,n,a,a+b-1,(t==1?i:-i),Up[1]);
        }
        else
            printf("%d\n",Max[1]);
    }
    return 0;
}