Cod sursa(job #3157150)

Utilizator stefandutastefandutahoria stefanduta Data 14 octombrie 2023 14:57:24
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.48 kb
#include <fstream>
#define NMAX 100005

using namespace std;

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

struct ok{
    int l, r, val, maxx, lungime;
};

ok aint[2 * NMAX];
int dirty[2 * NMAX];

void push(int node, int leftson, int rightson)
{
    dirty[leftson] = dirty[leftson] + dirty[node];
    aint[leftson].val = aint[leftson].val + dirty[node];

    dirty[rightson] = dirty[rightson] + dirty[node];
    aint[rightson].val = aint[rightson].val + dirty[node];

    if (dirty[node] == -1)
    {
        aint[leftson].l = aint[leftson].lungime;
        aint[leftson].r = aint[leftson].lungime;
        aint[leftson].maxx = aint[leftson].lungime;
    }
    else if (dirty[node] == 1)
    {
        aint[leftson].l = 0;
        aint[leftson].r = 0;
        aint[leftson].maxx = 0;
    }

    if (dirty[node] == -1)
    {
        aint[rightson].l = aint[rightson].lungime;
        aint[rightson].r = aint[rightson].lungime;
        aint[rightson].maxx = aint[rightson].lungime;
    }
    else if (dirty[node] == 1)
    {
        aint[rightson].l = 0;
        aint[rightson].r = 0;
        aint[rightson].maxx = 0;
    }

    dirty[node] = 0;
}

void update(int node, int nleft, int nright, int st, int dr, int val)
{
    //out << nleft << " " << nright << " " << (st <= nleft && nright <= dr) << " " << node << " ";
    int nmid = (nleft + nright) / 2;
    int leftson = node + 1;
    int rightson = node + 2 * (nmid - nleft + 1);

    //out << " -> " << nleft << " " << nmid << " " << leftson << " sau " << nmid + 1 << " " <<  nright << " " << rightson << '\n';

    if (st <= nleft && nright <= dr)
    {
        dirty[node] = val;
        aint[node].val = aint[node].val + val;
        if (val == -1)
        {
            aint[node].l = nright - nleft + 1;
            aint[node].r = nright - nleft + 1;
            aint[node].maxx = nright - nleft + 1;
        }
        else if (val == 1)
        {
            aint[node].l = 0;
            aint[node].r = 0;
            aint[node].maxx = 0;
        }

        if (nleft != nright)
            push(node, leftson, rightson);
        else if (nleft == nright)
            dirty[node] = 0;

        return;
    }

    if (nleft != nright)
    {
        push(node, leftson, rightson);

        update(leftson, nleft, nmid, st, dr, val);
        update(rightson, nmid + 1, nright, st, dr, val);

        aint[node].maxx = max(aint[leftson].maxx, max(aint[rightson].maxx, aint[leftson].r + aint[rightson].l));
        aint[node].l = aint[leftson].l;
        if (aint[leftson].l == aint[leftson].lungime)
            aint[node].l = aint[node].l + aint[rightson].l;

        aint[node].r = aint[rightson].r;
        if (aint[rightson].r == aint[rightson].lungime)
            aint[node].r = aint[node].r + aint[leftson].r;

        aint[node].maxx = max(aint[node].maxx, max(aint[node].l, aint[node].r));
    }
}

void build(int node, int nleft, int nright)
{
    if (nleft == nright)
    {
        aint[node].lungime = 1;
        aint[node].maxx = 1;
        aint[node].l = 1;
        aint[node].r = 1;
        return;
    }

    int nmid = (nleft + nright) / 2;
    int leftson = node + 1;
    int rightson = node + 2 * (nmid - nleft + 1);

    build(leftson, nleft, nmid);
    build(rightson, nmid + 1, nright);

    aint[node].lungime = aint[leftson].lungime + aint[rightson].lungime;
    aint[node].maxx = aint[node].lungime;
    aint[node].l = aint[leftson].l + aint[rightson].l;
    aint[node].r = aint[leftson].r + aint[rightson].r;
}

int main()
{
    int n, p, i, j, a, b, c;
    in >> n >> p;
    build(1, 1, n);

    /*for (i = 1; i <= 2 * n; ++i)
        out << aint[i].maxx << " ";
    out << '\n';*/

    for (i = 1; i <= p; ++i)
    {
        in >> c;
        if (c == 1)
        {
            in >> a >> b;
            update(1, 1, n, a, a + b - 1, 1);
            /*for (j = 1; j <= 2 * n; ++j)
                out << aint[j].maxx << " ";
            out << '\n';
            out << '\n';*/
        }
        else if (c == 2)
        {
            in >> a >> b;
            update(1, 1, n, a, a + b - 1, -1);
            /*for (j = 1; j <= 2 * n; ++j)
                out << aint[j].maxx << " ";
            out << '\n';
            out << '\n';*/
        }
        else if (c == 3)
        {
            out << aint[1].maxx << '\n';
        }
    }

    /*for (i = 1; i <= 2 * n; ++i)
        out << aint[i].maxx << " ";*/
    return 0;
}