Cod sursa(job #2098700)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 3 ianuarie 2018 13:54:33
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
# include <fstream>
# define DIM 600010
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct arbore{
    int st,dr,Max,val;
} arb[DIM];
int n,m,st,dr,val,tp,i;
void schimba(int nod,int st,int dr){
    if(arb[nod].val){
        if(arb[nod].val==1){
            arb[2*nod].val=1;
            arb[2*nod+1].val=1;
            arb[nod].val=0;
            arb[nod].st=arb[nod].dr=arb[nod].Max=0;
        }
        else{
            arb[2*nod].val=2;
            arb[2*nod+1].val=2;
            arb[nod].val=0;
            arb[nod].st=arb[nod].dr=arb[nod].Max=dr-st+1;
        }
    }
}
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,int tp){
    if(p<=st&&u>=dr){
        arb[nod].val=tp;
        schimba(nod,st,dr);
        return;
    }
    int mij=(st+dr)/2;
    schimba(2*nod,st,mij);
    schimba(2*nod+1,mij+1,dr);
    if(p<=mij)
        update(2*nod,st,mij,p,u,tp);
    if(u>mij)
        update(2*nod+1,mij+1,dr,p,u,tp);
    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;
            schimba(1,1,n);
            update(1,1,n,st,dr,tp);
            continue;
        }
        fout<<arb[1].Max<<"\n";
    }
    return 0;
}