Cod sursa(job #3142370)

Utilizator SSKMFSS KMF SSKMF Data 20 iulie 2023 22:11:48
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <fstream>
using namespace std;

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

struct Nod {
    int lungime_maxima , prefix , sufix , update;
} Arbore[400000];

void Build (int nod , int stanga , int dreapta)
{
    if (stanga == dreapta) {
        Arbore[nod].lungime_maxima = Arbore[nod].prefix = Arbore[nod].sufix = 1;
        Arbore[nod].update = -1;
        return;
    }

    int mijloc = (stanga + dreapta) >> 1;
    Build((nod << 1) , stanga , mijloc);
    Build((nod << 1) + 1 , mijloc + 1 , dreapta);
    Arbore[nod].lungime_maxima = Arbore[nod].prefix = Arbore[nod].sufix = dreapta - stanga + 1;
    Arbore[nod].update = -1;
}

void Lazy_Update (int nod , int stanga , int dreapta)
{
    if (Arbore[nod].update == -1)
        return;

    Arbore[nod].lungime_maxima = Arbore[nod].prefix = Arbore[nod].sufix = (!Arbore[nod].update ? dreapta - stanga + 1 : 0);
    if (stanga != dreapta)  Arbore[nod << 1].update = Arbore[(nod << 1) + 1].update = Arbore[nod].update;
    Arbore[nod].update = -1;
}

void Update (int nod , int stanga , int dreapta , int stanga_interval , int dreapta_interval , int valoare)
{
    Lazy_Update(nod , stanga , dreapta);

    if (stanga_interval <= stanga && dreapta <= dreapta_interval) {
        Arbore[nod].update = valoare; Lazy_Update(nod , stanga , dreapta);
        return;
    }

    int mijloc = (stanga + dreapta) >> 1;
    if (stanga_interval <= mijloc) Update((nod << 1) , stanga , mijloc , stanga_interval , dreapta_interval , valoare);
        else Lazy_Update(nod << 1 , stanga , mijloc);
    if (dreapta_interval > mijloc) Update((nod << 1) + 1 , mijloc + 1 , dreapta , stanga_interval , dreapta_interval , valoare);
        else Lazy_Update((nod << 1) + 1 , mijloc + 1 , dreapta);

    Arbore[nod].prefix = (Arbore[nod << 1].prefix == mijloc - stanga + 1 ? Arbore[nod << 1].prefix + Arbore[(nod << 1) + 1].prefix : Arbore[nod << 1].prefix);
    Arbore[nod].sufix = (Arbore[(nod << 1) + 1].sufix == dreapta - mijloc ? Arbore[nod << 1].sufix + Arbore[(nod << 1) + 1].sufix : Arbore[(nod << 1) + 1].sufix);
    Arbore[nod].lungime_maxima = max(Arbore[nod << 1].sufix + Arbore[(nod << 1) + 1].prefix , max(Arbore[nod << 1].lungime_maxima , Arbore[(nod << 1) + 1].lungime_maxima));
}

int main ()
{
    int lungime , operatii;
    cin >> lungime >> operatii;
    Build(1 , 1 , lungime);

    for (int indice = 1 , tip , inceput , lungime_secventa ; indice <= operatii ; indice++)
    {
        cin >> tip;

        if (tip != 3) cin >> inceput >> lungime_secventa , Update(1 , 1 , lungime , inceput , inceput + lungime_secventa - 1 , (tip == 1 ? 1 : 0));
        else cout << Arbore[1].lungime_maxima << '\n';
    }

    cout.close(); cin.close();
    return 0;
}