Cod sursa(job #432165)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 1 aprilie 2010 22:02:14
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<iostream>

using namespace std;

#define NMAX 100001
#define max(a,b) ((a>b)?a:b)

using namespace std;

int maxa[4*NMAX+100],maxa_s[4*NMAX+100],maxa_d[4*NMAX+100];
int oc;
int st,fn;

void update(int n,int l,int r)
{
    int cs=2*n;
    int cd=2*n+1;
     int m;
    m=(l+r)/2;
    if(st<=l && r<=fn)
    {
        if(!oc)
            maxa[n]=maxa_s[n]=maxa_d[n]=r-l+1;
        else
            maxa[n]=maxa_s[n]=maxa_d[n]=0;
        return;
    }
    if(oc && maxa[n]==r-l+1)
    {
        maxa[cs]=maxa_s[cs]=maxa_d[cs]=m-l+1;
        maxa[cd]=maxa_s[cd]=maxa_d[cd]=r-m;
    }
    if(!oc && maxa[n]==0)
    {
        maxa[cs]=maxa_s[cs]=maxa_d[cs]=0;
        maxa[cd]=maxa_s[cd]=maxa_d[cd]=0;
    }
    if(st<=m) update(cs,l,m);
    if(m<fn)update(cd,m+1,r);

    maxa[n]=max(maxa[cs],maxa[cd]);
    maxa[n]=max(maxa[n],maxa_d[cs]+maxa_s[cd]);

    maxa_s[n]=maxa_s[cs];
    if(maxa[cs]==m-l+1)
        maxa_s[n]=maxa[cs]+maxa_s[cd];

    maxa_d[n]=maxa_d[cd];
    if(maxa[cd]==r-m)
        maxa_d[n]=maxa[cd]+maxa_d[cs];
}


int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    int i,n,m;
    int a,b;
    scanf("%d%d",&n,&m);
    oc=0;
    maxa[1]=maxa_s[1]=maxa_d[1]=n;
    for(i=1;i<=m;i++)
    {
        int op;
        scanf("%d",&op);
        if(op!=3) scanf("%d%d",&a,&b);
        switch(op)
        {
            case 1:
                st=a; fn=a+b-1;
                oc=1;
                update(1,1,n);
                break;
            case 2:
                st=a; fn=a+b-1;
                oc=0;
                update(1,1,n);
                break;
            case 3:
                printf("%d\n",maxa[1]);
                break;
        }
    }
    return 0;
}