Cod sursa(job #2758566)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 11 iunie 2021 10:10:34
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>

using namespace std;

const int N = 1e5;
const int P2MAX = (1 << 18);

struct t {
    int sum = 0;
    int sum_st = 0;
    int sum_dr = 0;
    int sum_tot = 0;
};

t aint[P2MAX];
int a, b, val;

void actualizare(int p, int st, int dr) {
    if (st >= a && dr <= b) {
        aint[p].sum = aint[p].sum_st = aint[p].sum_dr = aint[p].sum_tot = val * (dr - st + 1);
        return;
    }
    int m = (st + dr) / 2;
    if (aint[p].sum_tot == dr - st + 1) {
        aint[2 * p].sum = aint[2 * p].sum_st = aint[2 * p].sum_dr = aint[2 * p].sum_tot = m - st + 1;
        aint[2 * p + 1].sum = aint[2 * p + 1].sum_st = aint[2 * p + 1].sum_dr = aint[2 * p + 1].sum_tot = dr - m;
    }
    else if (aint[p].sum_tot == 0) {
        aint[2 * p].sum = aint[2 * p].sum_st = aint[2 * p].sum_dr = aint[2 * p].sum_tot = 0;
        aint[2 * p + 1].sum = aint[2 * p + 1].sum_st = aint[2 * p + 1].sum_dr = aint[2 * p + 1].sum_tot = 0;
    }
    if (a <= m)
        actualizare(2 * p, st, m);
    if (b > m)
        actualizare(2 * p + 1, m + 1, dr);
    aint[p].sum = max(aint[2 * p].sum, aint[2 * p + 1].sum);
    aint[p].sum = max(aint[p].sum, aint[2 * p].sum_dr + aint[2 * p + 1].sum_st);
    aint[p].sum_st = aint[2 * p].sum_st;
    aint[p].sum_dr = aint[2 * p + 1].sum_dr;
    if (aint[2 * p].sum_tot == m - st + 1)
        aint[p].sum_st = aint[2 * p].sum_tot + aint[2 * p + 1].sum_st;
    if (aint[2 * p + 1].sum_tot == dr - m)
        aint[p].sum_dr = aint[2 * p + 1].sum_tot + aint[2 * p].sum_dr;
    aint[p].sum_tot = aint[2 * p].sum_tot + aint[2 * p + 1].sum_tot;
}

int main() {
    ifstream in("hotel.in");
    ofstream out("hotel.out");
    int n, q;
    in >> n >> q;
    a = 1, b = n, val = 1;
    actualizare(1, 1, n);
    while (q--) {
        int cer;
        in >> cer;
        if (cer == 1) {
            in >> a >> b;
            b = a + b - 1;
            val = 0;
            actualizare(1, 1, n);
        }
        else if (cer == 2) {
            in >> a >> b;
            b = a + b - 1;
            val = 1;
            actualizare(1, 1, n);
        }
        else
            out << aint[1].sum << '\n';
    }
    in.close();
    out.close();
    return 0;
}