Cod sursa(job #3144155)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 5 august 2023 12:06:22
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <fstream>

using namespace std;

const int Nmax = 100005;

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

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;
        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;
}

void update1(int nod, int st, int dr, int a, int b){
    if(st == dr && st == a && dr == b){
        aint[nod].max_len = 0;
        aint[nod].sufix = 0;
        aint[nod].prefix = 0;
        return;
    }

    int mid;

    mid = (st + dr) / 2;

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

    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;
    }
}

void update2(int nod, int st, int dr, int a, int b){
    if(st == dr && st == a && dr == b){
        aint[nod].max_len = dr - st + 1;
        aint[nod].sufix = dr - st + 1;
        aint[nod].prefix = dr - st + 1;
        return;
    }

    int mid;

    mid = (st + dr) / 2;

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

    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 if(op == 1){
            fin >> a >> b;
            update1(1, 1, n, a, a + b - 1);
        }
        else{
            fin >> a >> b;
            update2(1, 1, n, a, a + b - 1);
        }
    }

    return 0;
}