Cod sursa(job #2681164)

Utilizator LXGALXGA a LXGA Data 5 decembrie 2020 09:03:20
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <algorithm>

using namespace std;
struct camera {
    int prefix, sufix, maxx;
};
int n, p;
camera ai[500001];
ifstream cin("hotel.in");
ofstream cout("hotel.out");
void build(int nod, int x, int y)
{
    if (x != y)
    {
        int mij = (x + y) / 2;
        build(2 * nod, x, mij);
        build(2 * nod + 1, mij + 1, y);
    }
    ai[nod].prefix = ai[nod].sufix = ai[nod].maxx = y - x + 1;
}
void update(int nod, int x, int y, int a, int b, int val)
{
    if (x >= a && y <= b)
    {
        if (val == 1)
            ai[nod].prefix = ai[nod].sufix = ai[nod].maxx = 0;
        else
            ai[nod].prefix = ai[nod].sufix = ai[nod].maxx = y - x + 1;
    }
    else
    {
        int mij = (x + y) / 2;
        if (ai[nod].maxx == 0)
        {
            ai[2 * nod] = { 0,0,0 };
            ai[2 * nod + 1] = { 0,0,0 };
        }
        else if (ai[nod].maxx == y - x + 1)
        {
            ai[2*nod].prefix = ai[2*nod].sufix = ai[2*nod].maxx = mij - x + 1;
            ai[2*nod+1].prefix = ai[2*nod+1].sufix = ai[2*nod+1].maxx = y - mij;
        }
        if (a <= mij)
            update(2 * nod, x, mij, a, b, val);
        if (b > mij)
            update(2 * nod + 1, mij + 1, y, a, b, val);
        ai[nod].maxx = max({ ai[2 * nod].maxx, ai[2 * nod + 1].maxx , ai[2 * nod].sufix + ai[2 * nod + 1].prefix });
        ai[nod].prefix = ai[2 * nod].prefix;
        if (ai[nod].prefix == mij - x + 1) ai[nod].prefix += ai[2 * nod + 1].prefix;
        
        ai[nod].sufix = ai[2 * nod + 1].sufix;
        if (ai[nod].sufix == y - mij) ai[nod].sufix += ai[2 * nod].sufix;
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin >> n >> p;
    int x, a, b;
    build(1, 1, n);
    for (int i = 1; i <= p; i++)
    {
        cin >> x;
        if (x == 3)
        {
            cout << ai[1].maxx << '\n';
        }
        else
        {
            cin >> a >> b;
            update(1, 1, n, a, a + b - 1, x);
        }
    }
    return 0;
}