Cod sursa(job #1775871)

Utilizator mariakKapros Maria mariak Data 10 octombrie 2016 19:34:37
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>
#define Nmax 100002
FILE *fin  = freopen("hotel.in", "r", stdin);
FILE *fout = freopen("hotel.out", "w", stdout);

using namespace std;
int n, m, lazy[4 * Nmax];
struct interval
{
    int p;
    int q;
    int len;
} ST[4 * Nmax];
int Max(int x, int y)
{
    return (x > y ? x : y);
}
void build(int node, int l, int r)
{
    lazy[node] = -1;
    ST[node].len = ST[node].p = ST[node].q = r - l + 1;
    if(l == r) return;

    int mid = (l + r) / 2;
    build(2 * node, l, mid);
    build(2 * node + 1, mid + 1, r);
}
void upd(int node, int l, int r, int val)
{
    if(val == 1)
        ST[node].p = ST[node].q = ST[node].len = 0;
    else ST[node].p = ST[node].q = ST[node].len = r - l + 1;
}
void shift(int node)
{
    lazy[2 * node] = lazy[node];
    lazy[2 * node + 1] = lazy[node];
}
void update(int node, int s, int e, int l, int r, int v)
{
    if(lazy[node] != -1)
    {
        upd(node, s, e, lazy[node]);
        if(s != e)
            shift(node);
        lazy[node] = -1;
    }
    if(s > e || s > r || e < l) return;

    /// completely included
    if(l <= s && e <= r)
    {
        upd(node, s, e, v);
        lazy[node] = v;
        if(s != e)
            shift(node);
        lazy[node] = -1;
        return;
    }
    if(s != e)
    {
        int ls = 2 * node, rs = ls + 1;
        int mid = (s + e) / 2;
        update(2 * node, s, mid, l, r, v);
        update(2 * node + 1, mid + 1, e, l, r, v);

        ST[node].len = Max(ST[ls].len, Max(ST[rs].len, ST[ls].q + ST[rs].p));
        ST[node].p = ST[ls].p;
        if(ST[node].p == (mid - s + 1) && ST[rs].p)
            ST[node].p += ST[rs].p;
        ST[node].q = ST[rs].q;
        if(ST[node].q == (e - mid) && ST[ls].q)
            ST[node].q += ST[ls].q;
    }
}
int main()
{
    int c, i, M;
    scanf("%d %d", &n, &m);
    build(1, 1, n);
    while(m --)
    {
        scanf("%d", &c);
        if(c == 3)
            printf("%d\n", ST[1].len);
        else
        {
            if(c == 2)
                c = 0;
            scanf("%d %d", &i, &M);
            update(1, 1, n, i, i + M - 1, c);
        }
    }
    return 0;
}