Cod sursa(job #1368246)

Utilizator livliviLivia Magureanu livlivi Data 2 martie 2015 15:27:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include<cstdio>
#define MAX_N 100000
#define MAX_A 262144
using namespace std;

class nod{
public:
    int prefix,sufix,lmax;

    void init1(){
        prefix=0;
        sufix=0;
        lmax=0;
    }
    void init0(int l){
        prefix=l;
        sufix=l;
        lmax=l;
    }
};

nod aint[MAX_A];
int st,dr,ce;


int max(int a,int b,int c){
    if (a>=b &&a>=c) return a;
    else
    if (b>=a &&b>=c) return b;
    else return c;
}


void build(int i,int begin,int end){
    int mid;
    aint[i].init0(end-begin+1);

    if (begin==end) return ;

    mid=(begin+end)/2;
    build(i*2,begin,mid);
    build(i*2+1,mid+1,end);
}


void update(int i,int begin,int end){
    int mid=(begin+end)/2;

    if (st<=begin &&dr>=end){
        if (ce==0) aint[i].init0(end-begin+1);
        else aint[i].init1();
        return ;
    }

    if (aint[i].lmax==0){
        aint[i*2].init1();
        aint[i*2+1].init1();
    }
    else
    if (aint[i].lmax==end-begin+1){
        aint[i*2].init0(mid-begin+1);
        aint[i*2+1].init0(end-mid);
    }

    if (dr<=mid) update(i*2,begin,mid);
    else
    if (st>mid) update(i*2+1,mid+1,end);
    else {
        update(i*2,begin,mid);
        update(i*2+1,mid+1,end);
    }

    if (aint[i*2].prefix==mid-begin+1) aint[i].prefix=aint[i*2].prefix+aint[i*2+1].prefix;
    else aint[i].prefix=aint[i*2].prefix;

    if (aint[i*2+1].sufix==end-mid) aint[i].sufix=aint[i*2].sufix+aint[i*2+1].sufix;
    else aint[i].sufix=aint[i*2+1].sufix;

    aint[i].lmax=max(aint[i*2].lmax,aint[i*2+1].lmax,aint[i*2].sufix+aint[i*2+1].prefix);
}


int main(){
    freopen ("hotel.in","r",stdin);
    freopen ("hotel.out","w",stdout);
    int n,i,p,op;

    scanf ("%d%d",&n,&p);

    build(1,1,n);

    for(i=1;i<=p;i++){
        scanf ("%d",&op);

        if (op==1){
            scanf ("%d%d",&st,&dr);
            dr=st+dr-1;
            ce=1;
            update(1,1,n);
        }
        else
        if (op==2){
            scanf ("%d%d",&st,&dr);
            dr=st+dr-1;
            ce=0;
            update(1,1,n);
        }
        else printf ("%d\n",aint[1].lmax);
    }
    return 0;
}