Cod sursa(job #3144444)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 8 august 2023 13:38:31
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <fstream>

using namespace std;

const int Nmax = 100005;

struct node{
    int max_len;
    int sufix;
    int prefix;
    int prop;
};

int n;
node aint[4 * Nmax];

void build(int nod, int st, int dr){
    if(st == dr){
        aint[nod].max_len = 1;
        aint[nod].sufix = 1;
        aint[nod].prefix = 1;
        aint[nod].prop = -1;
        return;
    }

    int mid;

    mid = (st + dr) / 2;

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

    aint[nod].max_len = aint[2 * nod].max_len + aint[2 * nod + 1].max_len;
    aint[nod].sufix = aint[2 * nod].sufix + aint[2 * nod + 1].sufix;
    aint[nod].prefix = aint[2 * nod].prefix + aint[2 * nod + 1].prefix;
    aint[nod].prop = -1;
}

void modify(int nod, int st, int dr, int type){
    if(type == 0){
        aint[nod].max_len = 0;
        aint[nod].sufix = 0;
        aint[nod].prefix = 0;
    }
    else{
        aint[nod].max_len = dr - st + 1;
        aint[nod].sufix = dr - st + 1;
        aint[nod].prefix = dr - st + 1;
    }

    aint[nod].prop = type;
}

void update(int nod, int st, int dr, int a, int b, int type){
    if(st == a && dr == b){
        modify(nod, st, dr, type);
        return;
    }

    int mid;

    mid = (st + dr) / 2;

    if(aint[nod].prop != -1){
        modify(2 * nod, st, mid, aint[nod].prop);
        modify(2 * nod + 1, mid + 1, dr, aint[nod].prop);
        aint[nod].prop = -1;
    }

    if(b <= mid){
        update(2 * nod, st, mid, a, b, type);
    }
    else if(mid < a){
        update(2 * nod + 1, mid + 1, dr, a, b, type);
    }
    else{
        update(2 * nod, st, mid, a, mid, type);
        update(2 * nod + 1, mid + 1, dr, mid + 1, b, type);
    }

    aint[nod].max_len = max(aint[2 * nod].max_len, aint[2 * nod + 1].max_len);
    aint[nod].max_len = max(aint[nod].max_len, aint[2 * nod].sufix + aint[2 * nod + 1].prefix);

    if(aint[2 * nod].prefix == mid - st + 1){
        aint[nod].prefix = aint[2 * nod].prefix + aint[2 * nod + 1].prefix;
    }
    else{
        aint[nod].prefix = aint[2 * nod].prefix;
    }

    if(aint[2 * nod + 1].sufix == dr - mid){
        aint[nod].sufix = aint[2 * nod + 1].sufix + aint[2 * nod].sufix;
    }
    else{
        aint[nod].sufix = aint[2 * nod + 1].sufix;
    }
}

int main(){
    ifstream fin("hotel.in");
    ofstream fout("hotel.out");

    int p, a, b, op;

    fin >> n >> p;

    build(1, 1, n);

    while(p--){
        fin >> op;

        if(op == 3){
            fout << aint[1].max_len << '\n';
        }
        else{
            fin >> a >> b;

            if(op == 1){
                update(1, 1, n, a, a + b - 1, 0);
            }
            else{
                update(1, 1, n, a, a + b - 1, 1);
            }
        }
    }

    return 0;
}