Cod sursa(job #1738766)

Utilizator cristina_borzaCristina Borza cristina_borza Data 7 august 2016 17:52:24
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>

#define NMAX 500005

using namespace std;

ifstream f ("hotel.in");
ofstream g ("hotel.out");

int n , m , type , x , y;

struct tree {
    int mx , st , dr;
};

tree arb[NMAX];

void update (int node , int inc , int sf , int ii , int si , int val) {
    if (inc >= ii && sf <= si) {
        if (val == 0)
            arb[node].mx = arb[node].st = arb[node].dr = 0;
        else
            arb[node].mx = arb[node].st = arb[node].dr = sf - inc + 1;

        return;
    }

    int mid = (inc + sf) / 2;
    if (arb[node].mx == sf - inc + 1) {
        arb[2 * node + 1].mx = arb[2 * node + 1].dr = arb[2 * node + 1].st = sf - mid;
        arb[2 * node].mx = arb[2 * node].dr = arb[2 * node].st = mid - inc + 1;
    }

    if (arb[node].mx == 0) {
        arb[2 * node + 1].mx = arb[2 * node + 1].dr = arb[2 * node + 1].st = 0;
        arb[2 * node].mx = arb[2 * node].dr = arb[2 * node].st = 0;
    }

    if (mid >= ii) {
        update (2 * node , inc , mid , ii , si , val);
    }

    if (mid < si) {
        update (2 * node + 1 , mid + 1 , sf , ii , si , val);
    }

    arb[node].mx = max(arb[2 * node].mx , arb[2 * node + 1].mx);
    arb[node].mx = max(arb[node].mx , arb[2 * node].dr + arb[2 * node + 1].st);

    arb[node].st = arb[2 * node].st + arb[2 * node + 1].st * (arb[2 * node].st == mid - inc + 1);
    arb[node].dr = arb[2 * node + 1].dr + arb[2 * node].dr * (arb[2 * node + 1].dr == sf - mid);
}

int main() {
    f >> n >> m;
    update(1 , 1 , n , 1 , n , 1);
    for (int i = 1; i <= m; ++i) {
        f >> type;
        if (type == 3) {
            g << arb[1].mx << '\n';
        }

        else {
            f >> x >> y;
            if (type == 1) {
                update (1 , 1 , n , x , x + y - 1 , 0);
            }

            else {
                update (1 , 1 , n , x , x + y - 1 , 1);
            }
        }
    }
    return 0;
}