Cod sursa(job #2098628)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 3 ianuarie 2018 12:18:08
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
# include <fstream>
# define DIM 400010
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct arbore{
    int st,dr,Max,val;
} arb[DIM];
int trans[DIM],n,m,st,dr,val,tp,i;
void build(int nod,int st,int dr){
    if(st==dr){
        arb[nod].st=arb[nod].dr=arb[nod].Max=1;
        return;
    }
    int mij=(st+dr)/2;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
}
void update(int nod,int st,int dr,int p,int u){
    if(trans[nod]!=arb[nod].val){
        if(arb[nod].Max==0){
            arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
            arb[nod].val=0;
            trans[nod]=0;
            trans[2*nod]=0;
            trans[2*nod+1]=0;
        }
        else{
            arb[nod].st=arb[nod].dr=arb[nod].Max=0;
            arb[nod].val=1;
            trans[nod]=1;
            trans[2*nod]=1;
            trans[2*nod+1]=1;
        }
    }
    if(p<=st&&u>=dr){
        if(arb[nod].Max==0){
            arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
            arb[nod].val=0;
            trans[nod]=0;
            trans[2*nod]=0;
            trans[2*nod+1]=0;
        }
        else{
            arb[nod].st=arb[nod].dr=arb[nod].Max=0;
            arb[nod].val=1;
            trans[nod]=1;
            trans[2*nod]=1;
            trans[2*nod+1]=1;
        }
        return;
    }
    int mij=(st+dr)/2;
    if(p<=mij)
        update(2*nod,st,mij,p,u);
    if(u>mij)
        update(2*nod+1,mij+1,dr,p,u);
    arb[nod].Max=max(arb[2*nod].Max,arb[2*nod+1].Max);
    arb[nod].Max=max(arb[nod].Max,arb[2*nod].dr+arb[2*nod+1].st);
    arb[nod].st=arb[2*nod].st;
    if(arb[nod].st==mij-st+1)
        arb[nod].st+=arb[2*nod+1].st;
    arb[nod].dr=arb[2*nod+1].dr;
    if(arb[nod].dr==dr-mij)
        arb[nod].dr+=arb[2*nod].dr;
}
int main () {
    fin>>n>>m;
    build(1,1,n);
    for(i=1;i<=m;i++){
        fin>>tp;
        if(tp<=2){
            fin>>st>>val;
            dr=st+val-1;
            update(1,1,n,st,dr);
            continue;
        }
        fout<<arb[1].Max<<"\n";
    }
    return 0;
}