Cod sursa(job #1808625)

Utilizator giotoPopescu Ioan gioto Data 17 noiembrie 2016 21:53:54
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int k, tip, val, n, m, x, y, Sol;
struct arborel{
    int Max, first, last, L;
} Arb[400088];
inline void Update(int st, int dr, int nod){
    if(x <= st && dr <= y){
        if(val == 0)
            Arb[nod].first = Arb[nod].last = Arb[nod].Max = dr - st + 1;
        else
            Arb[nod].first = Arb[nod].last = Arb[nod].Max = 0;
        return ;
    }
    if(st > y || dr < x) return ;
    int mij = (st + dr) / 2;
    if(Arb[nod].Max == 0){
        Arb[nod * 2].Max = Arb[nod * 2].first = Arb[nod * 2].last = 0;
        Arb[nod * 2 + 1].Max = Arb[nod * 2 + 1].first = Arb[nod * 2 + 1].last = 0;
    }
    if(Arb[nod].Max == dr - st + 1){
        Arb[nod * 2].Max = Arb[nod * 2].first = Arb[nod * 2].last = mij - st + 1;
        Arb[nod * 2 + 1].Max = Arb[nod * 2 + 1].first = Arb[nod * 2 + 1].last = dr - mij;
    }
    if(x <= mij) Update(st , mij , nod * 2);
    if(y > mij) Update(mij + 1, dr , nod * 2 + 1);
    if(Arb[nod * 2].first == Arb[nod * 2].L)
        Arb[nod].first = Arb[nod * 2].L + Arb[nod * 2 + 1].first;
    else
        Arb[nod].first = Arb[nod * 2].first;

    if(Arb[nod * 2 + 1].last == Arb[nod * 2 + 1].L)
        Arb[nod].last = Arb[nod * 2 + 1].L + Arb[nod * 2].last;
    else
        Arb[nod].last = Arb[nod * 2 + 1].last;

    Arb[nod].Max = max(max(Arb[nod * 2].Max, Arb[nod * 2 + 1].Max)
                       , Arb[nod * 2].last + Arb[nod * 2 + 1].first);
}
inline void BuildArb(int st, int dr, int nod){
    Arb[nod].Max = Arb[nod].first = Arb[nod].last = Arb[nod].L = 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 = y + x - 1; val = 1;
            Update(1, n, 1);
        }else if(tip == 2){
            scanf("%d%d", &x, &y);
            y = y + x - 1; val = 0;
            Update(1, n, 1);
        }else
            printf("%d\n", Arb[1].Max);

    }
    return 0;
}