Cod sursa(job #2225411)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 26 iulie 2018 22:19:34
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");

const int NMAX = 100005;

struct AINT {
    int rmax, lmax; // subsecventa continua maxima care porneste din dreapta si stanga intervalului
    int maxlen; //subsecventa continua maxima
}aint[4 * NMAX];

void computenode(int node, int le, int ri) {
    int mid = (le + ri) / 2;
    aint[node].maxlen = max(aint[node * 2].rmax + aint[node * 2 + 1].lmax, max(aint[node * 2].maxlen, aint[node * 2 + 1].maxlen));

    aint[node].lmax = aint[node * 2].lmax;
    if(aint[node * 2].lmax == (mid - le + 1))
        aint[node].lmax += aint[node * 2 + 1].lmax;

    aint[node].rmax = aint[node * 2 + 1].rmax;
    if(aint[node * 2 + 1].rmax == (ri - mid))
        aint[node].rmax += aint[node * 2].rmax;
}

void update(int from, int to, bool state, int node, int le, int ri, int oldle, int oldri) {
    if(from <= le && ri <= to) {
        if(state == 1)
            aint[node].maxlen = aint[node].lmax = aint[node].rmax = 0;
        else
            aint[node].maxlen = aint[node].lmax = aint[node].rmax = (ri - le + 1);
    } else {
        int mid = (le + ri) / 2;
        if(aint[node].maxlen == 0)
            aint[node * 2].maxlen = aint[node * 2].rmax = aint[node * 2].lmax = aint[node * 2 + 1].maxlen = aint[node * 2 + 1].rmax = aint[node * 2 + 1].lmax = 0;
        if(aint[node].maxlen == (ri - le + 1)) {
            aint[node * 2].maxlen = aint[node * 2].rmax = aint[node * 2].lmax = mid - le + 1;
            aint[node * 2 + 1].maxlen = aint[node * 2 + 1].rmax = aint[node * 2 + 1].lmax = ri - mid;
        }
        if(from <= mid)
            update(from, to, state, node * 2, le, mid, le, ri);
        if(mid < to)
            update(from, to, state, node * 2 + 1, mid + 1, ri, le, ri);
        computenode(node, le, ri);
    }
}

void buildtree(int node, int le, int ri) {
    aint[node].rmax = aint[node].lmax = aint[node].maxlen = (ri - le + 1);
    if(le == ri)
        return;
    int mid = (le + ri) /2;
    buildtree(node * 2, le, mid);
    buildtree(node * 2 + 1, mid + 1, ri);
}

int main() {
    int n, p;
    in >> n >> p;
    buildtree(1, 1, n);
    aint[0].maxlen = -1;
    for(int i = 1; i <= p; i ++) {
        int c, start, m;
        in >> c;
        if(c == 1) {
            in >> start >> m;
            update(start, start + m - 1, 1, 1, 1, n, 1, n);
        }
        if(c == 2) {
            in >> start >> m;
            update(start, start + m - 1, 0, 1, 1, n, 1, n);
        }
        if(c == 3)
            out << aint[1].maxlen << "\n";
    }

    return 0;
}