Cod sursa(job #2156605)

Utilizator LolkekzorChiorean Tudor Lolkekzor Data 8 martie 2018 20:51:22
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
using namespace std;

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

struct {
    int maxi, stanga, dreapta;
} Arb[200010];

int n, m, x, y, q;

void Update(int nod, int st, int dr, int a, int b, int val) {
    if (dr < a || st > b)
        return;

    int mij;

    if (st >= a && dr <= b) {
        Arb[nod].maxi = Arb[nod].dreapta = Arb[nod].stanga = val * (dr - st + 1);
    } else {
        mij = (st + dr) / 2;

        if (Arb[nod].maxi == dr - st + 1) {
            Arb[nod * 2].maxi = Arb[nod * 2].dreapta = Arb[nod * 2].stanga = (mij - st + 1);
            Arb[nod * 2 + 1].maxi = Arb[nod * 2 + 1].dreapta = Arb[nod * 2 + 1].stanga = (dr - mij);
        }

        Update(nod * 2, st, mij, a, b, val);
        Update(nod * 2 + 1, mij + 1, dr, a, b, val);

        if (Arb[nod * 2].maxi == (mij - st + 1)) {
            Arb[nod].stanga = Arb[nod * 2].maxi + Arb[nod * 2 + 1].stanga;
        } else {
            Arb[nod].stanga = Arb[nod * 2].stanga;
        }

        if (Arb[nod * 2 + 1].maxi == (dr - mij)) {
            Arb[nod].dreapta = Arb[nod * 2 + 1].maxi + Arb[nod * 2].dreapta;
        } else {
            Arb[nod].dreapta = Arb[nod * 2 + 1].dreapta;
        }

        Arb[nod].maxi = max(max(Arb[nod * 2].maxi, Arb[nod * 2 + 1].maxi), Arb[nod * 2].dreapta + Arb[nod * 2 + 1].stanga);
    }
}

int main()
{
    fin >> n >> m;
    Update(1, 1, n, 1, n, 1);
    for (int i = 1 ; i <= m ; i++) {
        fin >> q;
        if (q == 3) fout << Arb[1].maxi << '\n';
        else {
            fin >> x >> y;
            Update(1, 1, n, x, x + y - 1, q - 1);
        }
    }

    return 0;
}