Cod sursa(job #69179)

Utilizator sealTudose Vlad seal Data 1 iulie 2007 18:07:15
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<stdio.h>
#define Ni 262144
#define max(a,b) ((a)>(b)?(a):(b))
int Max[Ni],Maxl[Ni],Maxr[Ni],Add[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 k, int sa)
{
    if(a<=l && r<=b)
    {
        Add[n]+=k;
        if(k>0)
            Max[n]=Maxl[n]=Maxr[n]=0;
        else
            Max[n]=Maxl[n]=Maxr[n]=r-l+1;
    }
    else
    {
        int m=(l+r)>>1;

        if(a<=m)
            update(n<<1,l,m,a,b,k,sa+Add[n<<1]);
        if(b>m)
            update(n<<1|1,m+1,r,a,b,k,sa+Add[n<<1|1]);
            
        if(Max[n<<1]==0 || Max[n<<1]==m-l+1)
            if(sa+Add[n<<1])
                Max[n<<1]=Maxl[n<<1]=Maxr[n<<1]=0;
            else
                Max[n<<1]=Maxl[n<<1]=Maxr[n<<1]=m-l+1;
                
        if(Max[n<<1|1]==0 || Max[n<<1|1]==r-m)
            if(sa+Add[n<<1|1])
                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;

        Max[n]=Maxr[n<<1]+Maxl[n<<1|1];
        Max[n]=max(Max[n],Max[n<<1]);
        Max[n]=max(Max[n],Max[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,t,i,j;

    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    
    scanf("%d%d",&n,&m);
    setintervals(1,1,n);

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