Cod sursa(job #2554361)

Utilizator LivcristiTerebes Liviu Livcristi Data 22 februarie 2020 20:24:43
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>
#define NUM 100005
struct nod
{
    int lazy, ls, ld, lmax;
};
nod a[4 * NUM];
int n, p, c, S, D;
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");

void build(int nod, int st, int dr)
{
    if(st == dr)
    {
        a[nod].ls = a[nod].ld = a[nod].lmax = 1;
        return;
    }

    int mij = st + ((dr - st) >> 1);

    build((nod << 1), st, mij);
    build((nod << 1) + 1, mij + 1, dr);
    a[nod].ls = a[nod].ld = a[nod].lmax = dr - st + 1;
}

void update(int nod, int st, int dr)
{
    if(a[nod].lazy == 1)
    {
        a[nod].ls = a[nod].ld = a[nod].lmax = 0;
        if(st != dr)
            a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 1;
        a[nod].lazy = -1;
    }
    else if(a[nod].lazy == 0)
    {
        a[nod].ls = a[nod].ld = a[nod].lmax = dr - st + 1;
        if(st != dr)
            a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 0;
        a[nod].lazy = -1;
    }

    if(st > D || dr < S)
        return;
    if(S <= st && dr <= D)
    {
        if(c == 1)
        {
            a[nod].ls = a[nod].ld = a[nod].lmax = 0;
            if(st != dr)
                a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 1;
        }
        else
        {
            a[nod].ls = a[nod].ld = a[nod].lmax = dr - st + 1;
            if(st != dr)
                a[(nod << 1)].lazy = a[(nod << 1) + 1].lazy = 0;
        }
        return;
    }

    int mij = st + ((dr - st) >> 1);

    update((nod << 1), st, mij);
    update((nod << 1) + 1, mij + 1, dr);

    a[nod].lmax = max(a[(nod << 1)].lmax, max(a[(nod << 1) + 1].lmax, a[(nod << 1)].ld + a[(nod << 1) + 1].ls));
    a[nod].ls = (a[(nod << 1)].lmax == mij - st + 1) ? a[(nod << 1)].lmax + a[(nod << 1) + 1].ls : a[(nod << 1)].ls;
    a[nod].ld = (a[(nod << 1) + 1].lmax == dr - mij) ? a[(nod << 1) + 1].lmax + a[(nod << 1)].ld : a[(nod << 1) + 1].ld;
}

int main()
{
    f >> n >> p;
    build(1, 1, n);
    for(int i = 0; i < p; ++i)
    {
        f >> c;
        if(c == 3)
            g << a[1].lmax << '\n';
        else
        {
            f >> S >> D;
            D = S + D - 1;
            update(1, 1, n);
        }
    }
    f.close();
    g.close();
}