Cod sursa(job #1801195)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 8 noiembrie 2016 19:16:46
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <algorithm>
using namespace std;

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

int a, b, val;

void update(int nod, int left, int right)
{
    if(left == right)
    {
        if(val == 0)
            aint[nod].pref = aint[nod].suf = aint[nod].ssmax = aint[nod].l = 1;
        else
        {
            aint[nod].pref = aint[nod].suf = aint[nod].ssmax = 0;
            aint[nod].l = 1;
        }
        return;
    }
    int mid = (left + right) / 2;
    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);
    aint[nod].l = right - left + 1;

}

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;

    update(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;
}