Cod sursa(job #1808581)

Utilizator giotoPopescu Ioan gioto Data 17 noiembrie 2016 21:04:29
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>
using namespace std;

int k, tip, val, n, m, x, y, Sol;
struct arborel{
    int Max, suf, pref, L;
} Arb[400088];
inline int max(int x, int y){
    return (x > y) ? x : y;
}
inline void Update(int st, int dr, int nod){
    if(x <= st && dr <= y){
        if(val == 0)
            Arb[nod].Max = Arb[nod].suf = Arb[nod].pref = dr - st + 1;
        else
            Arb[nod].Max = Arb[nod].suf = Arb[nod].pref = 0;
        return ;
    }
    int mid = (st + dr) / 2;
    if(Arb[nod].Max == 0)
        Arb[nod * 2].Max = Arb[nod * 2].suf = Arb[nod * 2].pref = Arb[nod * 2 + 1].suf = Arb[nod * 2 + 1].pref = Arb[nod * 2 + 1].Max = 0;
    else if(Arb[nod].Max == dr - st + 1){
        Arb[nod * 2].Max = Arb[nod * 2].suf = Arb[nod * 2].pref = mid - st + 1;
        Arb[nod * 2 + 1].Max = Arb[nod * 2 + 1].suf = Arb[nod * 2 + 1].pref = dr - mid;
    }
    if(mid >= x) Update(st, mid, nod * 2);
    if(mid < y) Update(mid + 1, dr, nod * 2 + 1);
    if(Arb[nod * 2].pref == Arb[nod * 2].L)
        Arb[nod].pref = Arb[nod * 2].L + Arb[nod * 2 + 1].pref;
    else
        Arb[nod].pref = Arb[nod * 2].pref;
    if(Arb[nod * 2 + 1].suf == Arb[nod * 2 + 1].L)
        Arb[nod].suf = Arb[nod * 2 + 1].suf + Arb[nod * 2].suf;
    else
        Arb[nod].suf = Arb[nod * 2 + 1].suf;
    Arb[nod].Max = max((Arb[nod * 2 + 1].Max, Arb[nod * 2].Max), Arb[nod * 2].suf + Arb[nod * 2 + 1].pref);
}
inline void BuildArb(int st, int dr, int nod){
    Arb[nod].L = Arb[nod].Max = Arb[nod].suf = Arb[nod].pref = dr - st + 1;
    if(st == dr) return ;
    int mid = (st + dr) / 2;
    BuildArb(st, mid, nod * 2);
    BuildArb(mid + 1, dr, nod * 2 + 1);
}
int main()
{
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);
    scanf("%d%d", &n, &m);
    BuildArb(1, n, 1);
    for(int i = 1; i <= m ; ++i){
        scanf("%d", &tip);
        if(tip == 1){
            scanf("%d%d", &x, &y);
            y += x - 1; val = 1;
            Update(1, n, 1);
        }else if(tip == 2){
            scanf("%d%d", &x, &y);
            y += x - 1; val = 0;
            Update(1, n, 1);
        }else
            printf("%d\n", Arb[1].Max);

    }
    return 0;
}