Cod sursa(job #3347359)

Utilizator altomMirel Fanel altom Data 16 martie 2026 14:25:27
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

const int NMAX=1e5+5;
int n, p;

struct tree_node{
    int pref, suf, scmax, full, len, flag;
} aint[4*NMAX];


tree_node combine(tree_node left, tree_node right){
    tree_node rez;

    rez.flag=0;

    rez.len=left.len+right.len;
    rez.pref=left.pref, rez.suf=right.suf;
    rez.scmax=rez.full=0;
    if(left.full && right.full){
        rez.full=1;
    }
    if(left.full)
        rez.pref=left.len+right.pref;
    if(right.full)
        rez.suf=left.suf+right.len;

    rez.scmax=max(max(left.scmax, right.scmax), left.suf+right.pref);

//    cout<<rez.len<<" "<<rez.scmax<<'\n';

    return rez;
}

void build(int nod, int st, int dr){
    if(st==dr){
        aint[nod].full=aint[nod].len=aint[nod].scmax=aint[nod].pref=aint[nod].suf=1;
    }else{
        int mij=(st+dr)/2;

        build(2*nod, st, mij);
        build(2*nod+1, mij+1, dr);

        aint[nod]=combine(aint[2*nod], aint[2*nod+1]);
    }
}

void lazy_propag(int nod){
    if(aint[nod].flag==-1){
        aint[2*nod].full=aint[2*nod].scmax=aint[2*nod].pref=aint[2*nod].suf=0;
        aint[2*nod+1].full=aint[2*nod+1].scmax=aint[2*nod+1].pref=aint[2*nod+1].suf=0;
    }else{
        aint[2*nod].full=1;
        aint[2*nod].scmax=aint[2*nod].pref=aint[2*nod].suf=aint[2*nod].len;

        aint[2*nod+1].full=1;
        aint[2*nod+1].scmax=aint[2*nod+1].pref=aint[2*nod+1].suf=aint[2*nod+1].len;
    }

    aint[2*nod].flag=aint[nod].flag;
    aint[2*nod+1].flag=aint[nod].flag;
    aint[nod].flag=0;
}

void update(int nod, int st, int dr, int a, int b, int x){
    if(a<=st && dr<=b){
        if(x==-1){
            aint[nod].full=aint[nod].scmax=aint[nod].pref=aint[nod].suf=0;
        }else{
            aint[nod].full=1;
            aint[nod].scmax=aint[nod].pref=aint[nod].suf=aint[nod].len;
        }
        aint[nod].flag=x;
//        cout<<"wasd:"<<st<<" "<<dr<<" "<<x<<" "<<aint[nod].scmax<<'\n';
    }else{
        if(aint[nod].flag!=0)
            lazy_propag(nod);

//        cout<<nod<<" "<<st<<" "<<dr<<"\n";

        int mij=(st+dr)/2;
        if(a<=mij)
            update(2*nod, st, mij, a, b, x);
        if(mij<b)
            update(2*nod+1, mij+1, dr, a, b, x);

        aint[nod]=combine(aint[2*nod], aint[2*nod+1]);
//        cout<<aint[nod].scmax<<" "<<aint[2*nod].scmax<<" "<<aint[2*nod+1].scmax<<'\n';
    }
}

int main()
{
    fin>>n>>p;

    build(1, 1, n);

    int t, a, b;
    while(p--){
        fin>>t;
        if(t==1){
            fin>>a>>b;
//            cout<<a<<" "<<a+b-1<<'\n';
            update(1, 1, n, a, a+b-1, -1);
        }
        if(t==2){
            fin>>a>>b;
            update(1, 1, n, a, a+b-1, 1);
        }
        if(t==3){
            fout<<aint[1].scmax<<'\n';
        }
    }



    return 0;
}