Cod sursa(job #1423864)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 22 aprilie 2015 21:15:20
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>
#define N 400005

using namespace std;

int lazy[N], vn[N], vl[N], vr[N], a, b, n, m, q, tip;
void build(int nod, int l, int r)
{

    int mid = (l + r) / 2;
    vl[nod] = r-l+1;
    vr[nod] = r-l+1;
    vn[nod] = r - l + 1;
    if(l == r)
        return;
    build(2 * nod, l, mid);
    build(2 * nod + 1, mid + 1, r);
}
void update(int nod, int l, int r, int val)
{
    if(lazy[nod])
    {
        if(lazy[nod] == 1)
            vl[nod] = vr[nod] = vn[nod] = 0;
        else
            vl[nod] = vr[nod] = vn[nod] = r - l + 1;
        if(l != r)
        {
            lazy[2 * nod] = lazy[nod];
            lazy[2 * nod + 1] = lazy[nod];
        }
        lazy[nod] = 0;
    }
    if(a > r || b < l)
        return;
    if(a <= l && r <= b)
    {
        if(val == 1)
            vl[nod] = vr[nod] = vn[nod] = 0;
        else
            vl[nod] = vr[nod] = vn[nod] = r - l + 1;
        if(l != r)
        {
            lazy[2 * nod] = val;
            lazy[2 * nod + 1] = val;
        }
        return;
    }
    int mid = (l + r) / 2;
    update(2 * nod, l, mid, val);
    update(2 * nod + 1, mid + 1, r, val);
    vl[nod] = vl[2 * nod];
    if(vl[nod] == mid - l + 1)
        vl[nod] += vl[2 * nod + 1];
    vr[nod] = vr[2 * nod + 1];
    if(vr[nod] == r - mid)
        vr[nod] += vr[2 * nod];
    vn[nod] = max(max(vn[2 * nod], vn[2 * nod + 1]), vr[2 * nod] + vl[2 * nod + 1]);
}
int main()
{
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);
    scanf("%d%d", &n, &q);
    build(1, 1, n);
    for(; q; q--)
    {
        scanf("%d", &tip);
        if(tip == 1)
        {
            scanf("%d%d", &a, &m);
            b = a + m - 1;
            update(1, 1, n, 1);
            continue;
        }
        if(tip == 2)
        {
            scanf("%d%d", &a, &m);
            b = a + m - 1;
            update(1, 1, n, 2);
            continue;
        }
        printf("%d\n", vn[1]);
    }
    return 0;
}