Cod sursa(job #1242293)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 14 octombrie 2014 11:27:25
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

int N,mij[3*Nmax],st[3*Nmax],dr[3*Nmax],p[3*Nmax];

inline void Update(int nod, int l, int r, int x, int y, int val)
{
    if(l==x && y==r)
    {
        if(val==0)
        {
            mij[nod]=st[nod]=dr[nod]=r-l+1;
            p[nod]=0;
        }
        else
        {
            mij[nod]=st[nod]=dr[nod]=0;
            p[nod]=1;
        }
        return;
    }
    int mid=(l+r)/2;
    if(p[nod]==1)
    {
        mij[2*nod]=st[2*nod]=dr[2*nod]=0;
        mij[2*nod+1]=st[2*nod+1]=dr[2*nod+1]=0;
        p[2*nod]=p[2*nod+1]=1; p[nod]=-1;
    }
    else
        if(p[nod]==0)
        {
            mij[2*nod]=st[2*nod]=dr[2*nod]=mid-l+1;
            mij[2*nod+1]=st[2*nod+1]=dr[2*nod+1]=r-mid;
            p[2*nod]=p[2*nod+1]=0; p[nod]=-1;

        }
    if(y<=mid)
        Update(2*nod,l,mid,x,y,val);
    else
        if(x>mid)
            Update(2*nod+1,mid+1,r,x,y,val);
        else
        {
            Update(2*nod,l,mid,x,mid,val);
            Update(2*nod+1,mid+1,r,mid+1,y,val);
        }
    mij[nod]=max(mij[2*nod],max(mij[2*nod+1],dr[2*nod]+st[2*nod+1]));
    st[nod]=st[2*nod];
    if(st[nod]==mid-l+1) st[nod]+=st[2*nod+1];
    dr[nod]=dr[2*nod+1];
    if(dr[nod]==r-mid) dr[nod]+=dr[2*nod];
}

inline void Build(int nod, int l, int r)
{
    if(l==r)
    {
        st[nod]=dr[nod]=mij[nod]=1;
        return ;
    }
    int mid=(l+r)/2;
    Build(2*nod,l,mid); Build(2*nod+1,mid+1,r);
    st[nod]=dr[nod]=mij[nod]=r-l+1;
}

int main()
{
    int M,i,tip,x,y;
    freopen ("hotel.in","r",stdin);
    freopen ("hotel.out","w",stdout);
    scanf("%d%d", &N,&M);
    Build(1,1,N);
    while(M--)
    {
        scanf("%d", &tip);
        if(tip==3) printf("%d\n", mij[1]);
        else
        {
            scanf("%d%d", &x,&y);
            if(tip==1) Update(1,1,N,x,x+y-1,1);
            else Update(1,1,N,x,x+y-1,0);
        }
    }

    return 0;
}