Cod sursa(job #2465083)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 29 septembrie 2019 13:24:39
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <iostream>
#define MAX 100001

using namespace std;

struct
{
    int nr, left, right;
    bool lazy;
}aint[MAX * 3];

int a, b, c;
bool sign;

void update(int nod, int st, int dr)
{
    if(a <= st && dr <= b)
    {

        if(sign)aint[nod].nr = aint[nod].left = aint[nod].right = dr - st + 1;
        else aint[nod].nr = aint[nod].left = aint[nod].right = 0;

        aint[nod].lazy = 1;
        return;
    }

    int mij = (st + dr) / 2;
    if(aint[nod].lazy)
    {
        aint[nod].lazy = 0;
        if(aint[nod].nr != 0)
        {
            aint[nod * 2].nr = aint[nod * 2].left = aint[nod * 2].right = mij - st + 1;
            aint[nod * 2 + 1].nr = aint[nod * 2 + 1].left = aint[nod * 2 + 1].right = dr - mij;
        }
        else
        {
            aint[nod * 2].nr = aint[nod * 2].left = aint[nod * 2].right = 0;
            aint[nod * 2 + 1].nr = aint[nod * 2 + 1].left = aint[nod * 2 + 1].right = 0;
        }

        aint[nod * 2].lazy = aint[nod * 2 + 1].lazy = 1;
    }

    if(a <= mij)update(nod * 2, st, mij);
    if(b > mij)update(nod * 2 + 1, mij + 1, dr);

    aint[nod].nr = max(aint[nod * 2].nr, aint[nod * 2 + 1].nr);
    aint[nod].nr = max(aint[nod].nr, aint[nod * 2].right + aint[nod * 2 + 1].left);
    aint[nod].left = aint[nod * 2].left;
    if(aint[nod * 2].left == mij - st + 1)aint[nod].left += aint[nod * 2 + 1].left;
    aint[nod].right = aint[nod * 2 + 1].right;

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

int main()
{
    int n, p, i, sol;

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

    fin >> n >> p;

    a = 1;
    b = n;
    sign = 1;
    update(1, 1, n);

    for(i = 0; i < p; i++)
    {
        fin >> c;

        if(c == 3)
        {
            sol = aint[1].nr;

            sol = max(sol, aint[1].left);
            sol = max(sol, aint[1].right);

            fout << sol << '\n';
        }
        else
        {
            fin >> a >> b;

            b = a + b - 1;
            if(c == 1)sign = 0;
            else sign = 1;

            update(1, 1, n);
        }
    }

    fin.close();
    fout.close();

    return 0;
}