Nu aveti permisiuni pentru a descarca fisierul grader_test7.ok

Cod sursa(job #3240626)

Utilizator adelinapetreAdelina Petre adelinapetre Data 18 august 2024 21:28:24
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.41 kb
#include <fstream>
using namespace std;

ifstream cin("hotel.in");
ofstream cout("hotel.out");

const int Nmax = 400005;

struct hotel
{
    int maxx, left, right;
    bool ocupat;
};

struct Aint
{
    hotel aint[Nmax];

    void build(int nod, int st, int dr)
    {
        if (st == dr)
        {
            aint[nod] = {1, 1, 1, 0};
            return;
        }
        int mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        aint[nod] = {dr - st + 1, dr - st + 1, dr - st + 1, 0};
    }

    void propaga(int nod, int st, int dr)
    {
        if (aint[nod].ocupat)
        {
            int mid = (st + dr) / 2;
            if (aint[nod].maxx == 0)
            {
                aint[2 * nod] = {0, 0, 0, 1};
                aint[2 * nod + 1] = {0, 0, 0, 1};
            }
            else
            {
                aint[2 * nod] = {mid - st + 1, mid - st + 1, mid - st + 1, 0};
                aint[2 * nod + 1] = {dr - mid, dr - mid, dr - mid, 0};
            }
            aint[nod].ocupat = 0;
        }
    }

    void baga(int nod, int st, int dr, int x, int y)
    {
        if (x > dr || y < st)
            return;
        if (x <= st && dr <= y)
        {
            aint[nod] = {0, 0, 0, 1};
            return;
        }
        propaga(nod, st, dr);
        int mid = (st + dr) / 2;
        baga(2 * nod, st, mid, x, y);
        baga(2 * nod + 1, mid + 1, dr, x, y);
        aint[nod].maxx = max(max(aint[2 * nod].maxx, aint[2 * nod + 1].maxx), aint[2 * nod].right + aint[2 * nod + 1].left);

        if (aint[2 * nod].left == mid - st + 1)
            aint[nod].left = aint[2 * nod].left + aint[2 * nod + 1].left;
        else
            aint[nod].left = aint[2 * nod].left;

        if (aint[2 * nod + 1].right == dr - mid)
            aint[nod].right = aint[2 * nod].right + aint[2 * nod + 1].right;
        else
            aint[nod].right = aint[2 * nod + 1].right;
    }

    void scoate(int nod, int st, int dr, int x, int y)
    {
        if (x > dr || y < st)
            return;
        if (x <= st && dr <= y)
        {
            aint[nod] = {dr - st + 1, dr - st + 1, dr - st + 1, 0};
            return;
        }
        propaga(nod, st, dr);
        int mid = (st + dr) / 2;
        scoate(2 * nod, st, mid, x, y);
        scoate(2 * nod + 1, mid + 1, dr, x, y);
        aint[nod].maxx = max(max(aint[2 * nod].maxx, aint[2 * nod + 1].maxx), aint[2 * nod].right + aint[2 * nod + 1].left);

        if (aint[2 * nod].left == mid - st + 1)
            aint[nod].left = aint[2 * nod].left + aint[2 * nod + 1].left;
        else
            aint[nod].left = aint[2 * nod].left;

        if (aint[2 * nod + 1].right == dr - mid)
            aint[nod].right = aint[2 * nod].right + aint[2 * nod + 1].right;
        else
            aint[nod].right = aint[2 * nod + 1].right;
    }

    int query()
    {
        return aint[1].maxx;
    }

} aint;

int main()
{
    int n, p, op, x, y;
    cin >> n >> p;
    aint.build(1, 1, n);
    for (int i = 1; i <= p; i++)
    {
        cin >> op;
        if (op == 3)
            cout << aint.query() << endl;
        else
        {
            cin >> x >> y;
            if (op == 1)
                aint.baga(1, 1, n, x, x + y - 1);
            else
                aint.scoate(1, 1, n, x, x + y - 1);
        }
    }
    return 0;
}