Cod sursa(job #1801163)

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

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

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

    update(1, 1, n, 1, n, 0);

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

    return 0;
}