Cod sursa(job #2208151)

Utilizator jumareastefanstefan jumarea jumareastefan Data 28 mai 2018 14:11:35
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>

#define MAX 1e16

using namespace std;

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

struct arb{
int st, dr, sol, lazy;
};

arb v[400055];
int n, s, d, x, i, p, l, r;

void initial(int a, int b, int nod)
{
    int mij = (a + b) / 2;
    v[nod].dr = v[nod].st = v[nod].sol = b - a + 1;
    if (a == b) return;
    initial(a, mij, nod*2);
    initial(mij + 1, b, nod*2 + 1);
}

void propag(int a, int b, int nod)
{
    if (v[nod].lazy == 0) return;
    if (v[nod].lazy == 1)
    {
        v[nod].dr = v[nod].st = v[nod].sol = 0;
    }
    else if (v[nod].lazy == 2)
    {
        v[nod].dr = v[nod].st = v[nod].sol = b - a + 1;
    }
    if (a<b)
    v[2*nod].lazy = v[2*nod + 1].lazy = v[nod].lazy;
    v[nod].lazy = 0;
}

void act(int a, int b, int ua, int ub, int nod, int val)
{
    int mij = (a + b) / 2;
    if (ua <= a && ub >= b)
    {
        v[nod].lazy = val;
        propag(a, b, nod);
        return;
    }
    propag(a, b, nod);
    if (ua <= mij) act(a, mij, ua, ub, 2*nod, val);
    else propag(a, mij, 2*nod);
    if (ub > mij) act (mij + 1, b, ua, ub, 2*nod + 1, val);
    else propag(mij + 1, b, 2*nod + 1);
    v[nod].sol = max (v[2*nod].dr + v[2*nod + 1].st, max(v[2*nod].sol, v[2*nod + 1].sol));
    v[nod].st = v[2*nod].st;
    if (v[nod].st == mij - a + 1)
        v[nod].st += v[2 * nod + 1].st;
    v[nod].dr = v[2 * nod + 1].dr;
    if (v[nod].dr == b - mij) v[nod].dr += v[2 * nod].dr;
}

int main()
{
    f>>n>>p;
    initial(1, n, 1);
    for (i=1; i<=p; i++)
    {
        f>>s;
        if (s == 3)
        {
            propag(1, n, 1);
            g<<v[1].sol;
        }
        f>>l>>r;
        r += l - 1;
        act(1, n, l, r, 1, s);
    }
    return 0;
}