Cod sursa(job #2068229)

Utilizator CammieCamelia Lazar Cammie Data 17 noiembrie 2017 13:43:31
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>

#define MAXN 100005 * 4

using namespace std;

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

int ssm[MAXN], L[MAXN], R[MAXN];

inline void Build(int poz, int st, int dr) {
    int mij = (st + dr) / 2;

    if (st == dr) {
        ssm[poz] = L[poz] = R[poz] = 1;
        return;
    }
    else {
        Build(poz * 2, st, mij);
        Build(poz * 2 + 1, mij + 1, dr);

        ssm[poz] = L[poz] = R[poz] = dr - st + 1;
    }
}

inline void Upload(int poz, int st, int dr, int ls, int ld, int val) {
    int mij = (st + dr) / 2;

    if (st > ld || dr < ls)
        return;
    if (st == dr) {
        R[poz] = L[poz] = ssm[poz] = val;
        return;
    }
    else {
        Upload(poz * 2, st, mij, ls, ld, val);
        Upload(poz * 2 + 1, mij + 1, dr, ls, ld, val);

        R[poz] = R[poz * 2 + 1]; L[poz] = L[poz * 2];

        if (ssm[poz * 2] == mij - st + 1)
            L[poz] = max(L[poz], ssm[poz * 2] + L[poz * 2 + 1]);
        if (ssm[poz * 2 + 1] == dr - mij)
            R[poz] = max(R[poz], ssm[poz * 2 + 1] + R[poz * 2]);

        ssm[poz] = max(ssm[poz * 2], max(ssm[poz * 2 + 1], L[poz * 2 + 1] + R[poz * 2]));
    }
}

inline void Read() {
    int N, m, tip, a, b;

    fin >> N >> m;

    Build(1, 1, N);

    for (int i = 1; i <= m; i++) {
        fin >> tip;

        if (tip == 1) { ///cazare
            fin >> a >> b;

            Upload(1, 1, N, a, a + b - 1, 0);
        }
        else if (tip == 2) {
            fin >> a >> b;

            Upload(1, 1, N, a, a + b - 1, 1);
        }
        else
            fout << ssm[1] << "\n";
    }
}

int main () {
    Read();

    fin.close(); fout.close(); return 0;
}