Cod sursa(job #1834680)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 24 decembrie 2016 21:28:41
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("hotel.in");
ofstream g("hotel.out");

const int NMAX = 100005;

int n, p;
int lf[4 * NMAX];
int rg[4 * NMAX];
int c[4 * NMAX];

inline void Join(int x, int u, int v, int l, int r) {
    int m = (l + r) / 2;
    c[x] = max(max(c[u], c[v]), rg[u] + lf[v]);
    lf[x] = (c[u] == m - l + 1 ? m - l + 1 + lf[v] : lf[u]);
    rg[x] = (c[v] == r - m ? rg[u] + r - m : rg[v]);
}

inline void Push(int x, int l, int r) {
    if (c[x] == r - l + 1) {
        int m = (l + r) / 2;
        c[x * 2] = m - l + 1;
        lf[x * 2] = m - l + 1;
        rg[x * 2] = m - l + 1;
        c[x * 2 + 1] = r - m;
        lf[x * 2 + 1] = r - m;
        rg[x * 2 + 1] = r - m;
    }
    else {
        if (c[x] == 0) {
            c[x * 2] = 0;
            lf[x * 2] = 0;
            rg[x * 2] = 0;
            c[x * 2 + 1] = 0;
            lf[x * 2 + 1] = 0;
            rg[x *2 + 1] =0;
        }
    }
}

void Build(int x, int l, int r) {
    c[x] = (r - l + 1);
    lf[x] = (r - l + 1);
    rg[x] = (r - l + 1);
    if (l < r) {
        int m = (l + r) / 2;
        Build(x * 2, l, m);
        Build(x * 2 + 1, m + 1, r);
    }
}

void Update(int x, int l, int r, int fi, int se, bool t) {
    if (fi <= r && l <= se) {
        if (fi <= l && r <= se) {
            if (t == true) {
                lf[x] = (r - l + 1);
                rg[x] = (r - l + 1);
                c[x] = (r - l + 1);
            }
            else {
                lf[x] = 0;
                rg[x] = 0;
                c[x] = 0;
            }
        }
        else {
            int m = (l + r) / 2;
            Push(x, l, r);
            Update(x * 2, l, m, fi, se, t);
            Update(x * 2 + 1, m + 1, r, fi, se, t);
            Join(x, x * 2, x * 2 + 1, l, r);
        }
    }
}

int main() {
    f >> n >> p;
    Build(1, 1, n);
    while (p--) {
        int q;
        f >> q;
        if (q == 3) {
            g << c[1] << "\n";
        }
        else {
            int i, v;
            f >> i >> v;
            Update(1, 1, n, i, i + v - 1, q - 1);
        }
    }
    return 0;
}