Cod sursa(job #1075641)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 9 ianuarie 2014 13:08:53
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

int s[4*Nmax],st[4*Nmax],dr[4*Nmax],x,y,N;

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

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

    if(y>mij)
        Update(nod*2+1,mij+1,r,val);

    val=st[2*nod];
    if(val==mij-l+1)
        val+=st[nod*2+1];
    st[nod]=val;

    val=dr[nod*2+1];
    if(val==r-mij)
        val+=dr[2*nod];
    dr[nod]=val;

    val=dr[nod*2]+st[2*nod+1];
    val=max(val, s[nod*2]);
    val=max(val, s[nod*2+1]);
    s[nod]=val;
    s[nod]=max(s[nod], st[nod]);
    s[nod]=max(s[nod], dr[nod]);
}

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