Cod sursa(job #2098969)

Utilizator anisca22Ana Baltaretu anisca22 Data 3 ianuarie 2018 20:00:45
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define PMAX 200005

using namespace std;

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

int N, P;
int aitMX[4 * NMAX], aitST[4 * NMAX], aitDR[4 * NMAX];

void build(int poz, int st, int dr)
{
    aitMX[poz] = aitST[poz] = aitDR[poz] = dr - st + 1;
    if (st == dr)
        return;
    int mij = st + (dr - st) / 2;
    build(2 * poz, st, mij);
    build(2 * poz + 1, mij + 1, dr);
}

void upd(int poz, int actLFT, int actRIT, int st, int dr, int tip)
{
    int mij = st + (dr - st) / 2;
    if (dr < actLFT || st > actRIT)
        return;
    if (st >= actLFT && actRIT >= dr)
    {
        aitMX[poz] = aitDR[poz] = aitST[poz] = tip * (dr - st + 1);
        return;
    }

    if (aitMX[poz] == 0)
        aitST[2 * poz] = aitDR[2 * poz] = aitMX[2 * poz] = aitST[2 * poz + 1] = aitDR[2 * poz + 1] = aitMX[2 * poz + 1] = 0;

    if (aitMX[poz] == dr - st + 1)
    {
        aitST[2 * poz] = aitDR[2 * poz] = aitMX[2 * poz] = mij - st + 1;
        aitST[2 * poz + 1] = aitDR[2 * poz + 1] = aitMX[2 * poz + 1] = dr - mij;
    }

    upd(2 * poz, actLFT, actRIT, st, mij, tip);
    upd(2 * poz + 1, actLFT, actRIT, mij + 1, dr, tip);

    aitST[poz] = aitST[2 * poz];
    if (aitST[2 * poz] == mij - st + 1)
        aitST[poz] += aitST[2 * poz + 1];

    aitDR[poz] = aitDR[2 * poz + 1];
    if (aitDR[2 * poz + 1] == dr - mij)
        aitDR[poz] += aitDR[2 * poz];

    aitMX[poz] = max(max(aitMX[2 * poz], aitMX[2 * poz + 1]), aitST[2 * poz + 1] + aitDR[2 * poz]);
}

int main()
{
    fin >> N >> P;
    build(1, 1, N);
    for (int i = 1; i <= P; i++)
    {
        int q;
        fin >> q;
        if (q == 1)
        {
            int start, come;
            fin >> start >> come;
            upd(1, start, start + come - 1, 1, N, 0);
        }
        if (q == 2)
        {
            int start, leave;
            fin >> start >> leave;
            upd(1, start, start + leave - 1, 1, N, 1);
        }
        if (q == 3)
            fout << aitMX[1] << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}