Cod sursa(job #1801505)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 9 noiembrie 2016 09:03:50
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <cstdio>
#include <algorithm>
using namespace std;

struct nodaint
{
    int pref, suf, ssmax, l;
}aint[400000];

int a, b, val;

void build_aint(int nod, int left, int right)
{
    aint[nod].pref = aint[nod].suf = aint[nod].ssmax = aint[nod].l = right - left + 1;
    if(left == right)
        return;
    int mid = (left + right) / 2;
    build_aint(nod * 2, left, mid);
    build_aint(nod * 2 + 1, mid + 1, right);
}

void update(int nod, int left, int right)
{
    if(left > b || right < a)
        return;
    if(a <= left && right <= b)
    {
        if(val == 0)
            aint[nod].pref = aint[nod].suf = aint[nod].ssmax = right - left + 1;
        else
            aint[nod].pref = aint[nod].suf = aint[nod].ssmax = 0;
        return;
    }

    int mid = (left + right) / 2;

    if(aint[nod].ssmax == 0)
        aint[nod * 2].ssmax = aint[nod * 2].suf = aint[nod * 2].pref = aint[nod * 2 + 1].ssmax = aint[nod * 2 + 1].suf = aint[nod *2 + 1].pref = 0;
    if(aint[nod].ssmax == right - left + 1)
    {
        aint[2 * nod].ssmax = aint[2 * nod].pref = aint[2 * nod].suf = mid - left + 1;
        aint[2 * nod + 1].ssmax = aint[2 * nod + 1].pref = aint[2 * nod + 1].suf= right - mid;
    }


    if(a <= mid)
        update(nod * 2, left, mid);
    if(b > mid)
        update(nod * 2 + 1, mid + 1, right);

    if(aint[nod * 2].pref == aint[nod * 2].l)
        aint[nod].pref = aint[nod * 2].l + aint[nod * 2 + 1].pref;
    else
        aint[nod].pref = aint[nod * 2].pref;

    if(aint[nod * 2 + 1].suf == aint[nod * 2 + 1].l)
        aint[nod].suf = aint[nod * 2 + 1].l + aint[nod * 2].suf;
    else
        aint[nod].suf = aint[nod * 2 + 1].suf;

    aint[nod].ssmax = max(max(aint[nod * 2].ssmax, aint[nod * 2 + 1].ssmax),
                          aint[nod * 2].suf + aint[nod * 2 + 1].pref);

}

int main()
{
    FILE *fin, *fout;

    fin = fopen("hotel.in", "r");
    fout = fopen("hotel.out", "w");

    int n, p;

    fscanf(fin, "%d%d\n", &n, &p);

    a = 1;
    b = n;
    val = 0;

    build_aint(1, 1, n);

    for(int i = 1; i <= p; i++)
    {
        char c;
        fscanf(fin, "%c", &c);
        if(c == '1')
        {
            fscanf(fin, "%d%d\n", &a, &b);
            b = a + b - 1;
            val = 1;
            update(1, 1, n);
        }
        else if(c == '2')
        {
            fscanf(fin, "%d%d\n", &a, &b);
            b = a + b - 1;
            val = 0;
            update(1, 1, n);
        }
        else
        {
            fprintf(fout, "%d\n", aint[1].ssmax);
            fscanf(fin, "%c", &c);
        }
    }

    return 0;
}