Cod sursa(job #1133603)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 5 martie 2014 08:51:57
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <cstdio>
#include <algorithm>

#define NMAX 100007

using namespace std;

struct hotel{
    int a;
    int b;
    int c;
};

hotel Arbi[NMAX * 3];

int _x, _y;

void update(int Nod, int st, int dr, int Val){
    if(st >= _x && dr <= _y){
        int F = Nod;
        Arbi[F].a = Arbi[F].b = Arbi[F].c = Val * (dr - st + 1);
        return ;
    }
    int med = (st + dr) >> 1, F = 2 * Nod;
    if(Arbi[Nod].c == 0){
        Arbi[F].a = Arbi[F].b = Arbi[F].c = 0;
        Arbi[F + 1].a = Arbi[F + 1].b = Arbi[F + 1].c = 0;
    }
    if(Arbi[Nod].c == dr - st + 1){
        Arbi[F].a = Arbi[F].b = Arbi[F].c = med - st + 1;
        Arbi[F + 1].a = Arbi[F + 1].b = Arbi[F + 1].c = dr - med;
    }
    if(_x <= med)
        update(Nod * 2, st, med, Val);
    if(_y > med)
        update(Nod * 2 + 1, med + 1, dr, Val);
    if(Arbi[F].a == med - st + 1)
        Arbi[Nod].a = Arbi[F].a + Arbi[F + 1].a;
    else
        Arbi[Nod].a = Arbi[F].a;
    if(Arbi[F + 1].b == dr - med)
        Arbi[Nod].b = Arbi[F + 1].b + Arbi[F].b;
    else
        Arbi[Nod].b = Arbi[F + 1].b;
    Arbi[Nod].c = Arbi[F].b + Arbi[F + 1].a;
    Arbi[Nod].c = max(Arbi[Nod].c, max(Arbi[Nod].a, Arbi[Nod].b));
    Arbi[Nod].c = max(Arbi[Nod].c, max(Arbi[F].c, Arbi[F + 1].c));
}

int main(){
    int n, m;
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);
    scanf("%d %d", &n, &m);
    _x = 1;
    _y = n;
    update(1, 1, n, 1);
    for(int i = 1; i <= m; ++i){
        int Tip;
        scanf("%d", &Tip);
        if(Tip == 1){
            scanf("%d %d", &_x, &_y);
            _y += _x - 1;
            update(1, 1, n, 0);
        }
        if(Tip == 2){
            scanf("%d %d", &_x, &_y);
            _y += _x - 1;
            update(1, 1, n, 1);
        }
        if(Tip == 3)
            printf("%d\n", Arbi[1].c);
    }
    return 0;
}