Cod sursa(job #2636394)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 17 iulie 2020 18:49:00
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <fstream>
using namespace std;

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

int a[400001], lazy[400001];
int p[400001], s[400001];
bool ok[400001]; //ok[i] = 1, daca nodul i contine numai 0

int qst, qdr, val;

inline void comb(int nod)
{
    a[nod] = max(max(a[nod<<1], a[nod<<1|1]), s[nod<<1] + p[nod<<1|1]);
    ok[nod] = ok[nod<<1] & ok[nod<<1|1];
    if (ok[nod<<1])
        p[nod] = a[nod<<1] + p[nod<<1|1];
    else
        p[nod] = p[nod<<1];
    
    if (ok[nod<<1|1])
        s[nod] = a[nod<<1|1] + s[nod<<1];
    else
        s[nod] = s[nod<<1|1];
}

void constr(int nod, int st, int dr)
{
    if (st != dr)
    {
        int mij = (st+dr)>>1;
        constr(nod<<1, st, mij);
        constr(nod<<1|1, mij+1, dr);
    }
    a[nod] = p[nod] = s[nod] = dr-st+1;
    ok[nod] = 1;
    lazy[nod] = -1;
}

void update(int nod, int st, int dr)
{
    int mij = (st+dr)>>1;
    if (st != dr && lazy[nod] != -1)
    {
        lazy[nod<<1] = lazy[nod<<1|1] = lazy[nod];
        if (lazy[nod] == 0)
        {
            a[nod<<1] = p[nod<<1] = s[nod<<1] = mij-st+1;
            a[nod<<1|1] = p[nod<<1|1] = s[nod<<1|1] = dr-mij;
            ok[nod<<1] = ok[nod<<1|1] = 1;
        }
        else
            a[nod<<1] = a[nod<<1|1] = s[nod<<1] = s[nod<<1|1] = p[nod<<1] = p[nod<<1|1] = ok[nod<<1] = ok[nod<<1|1] = 0;
        lazy[nod] = -1;
    }
    if (qst <= st && dr <= qdr)
    {
        lazy[nod] = val;
        if (val == 0)
        {
            a[nod] = p[nod] = s[nod] = dr-st+1;
            ok[nod] = 1;
        }
        else
            a[nod] = p[nod] = s[nod] = ok[nod] = 0;
        return;
    }
    if (qst <= mij)
        update(nod<<1, st, mij);
    if (mij < qdr)
        update(nod<<1|1, mij+1, dr);
    comb(nod);
}

int main()
{
    int n, p, t, i;
    fin >> n >> p;
    constr(1, 1, n);
    for (i = 1; i<=p; i++)
    {
        fin >> t;
        if (t == 1)
        {
            fin >> qst >> qdr;
            qdr = qst+qdr-1;
            val = 1;
            update(1, 1, n);
        }
        else if (t == 2)
        {
            fin >> qst >> qdr;
            qdr = qst+qdr-1;
            val = 0;
            update(1, 1, n);
        }
        else
            fout << a[1] << '\n';
    }
    return 0;
}