Cod sursa(job #1015661)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 24 octombrie 2013 22:05:23
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
using namespace std;

const int MAX_N = 300002;

struct SegmentTree {
    int ans, left, right;
};

int N, M;
SegmentTree A[MAX_N];

void buildTree(int node, int left, int right) {
    int m = (left + right)/2, ls = 2*node, rs = 2*node + 1;

    A[node].ans = A[node].left = A[node].right = right - left + 1;

    if(left != right) {
        buildTree(ls, left, m);
        buildTree(rs, m + 1, right);
    }
}

void update(int node, int left, int right, int x, int y, int val) {
    int m = (left + right)/2, ls = 2*node, rs = 2*node + 1;

    if(x <= left && right <= y)
        A[node].ans = A[node].left = A[node].right = (right - left + 1)*val;
    else {
        if(A[node].ans == right - left + 1) {
            A[ls].ans = A[ls].left = A[ls].right = m - left + 1;
            A[rs].ans = A[rs].left = A[rs].right = right - m;
        }
        else if(A[node].ans == 0) {
            A[ls].ans = A[ls].left = A[ls].right = 0;
            A[rs].ans = A[rs].left = A[rs].right = 0;
        }

        if(x <= m)
            update(ls, left, m, x, y, val);
        if(y > m)
            update(rs, m + 1, right, x, y, val);
        if(A[ls].left == m - left + 1)
            A[node].left = A[ls].left + A[rs].left;
        else A[node].left = A[ls].left;
        if(A[rs].right == right - m)
            A[node].right = A[rs].right + A[ls].right;
        else A[node].right = A[rs].right;
        A[node].ans = max(A[ls].ans, A[rs].ans);
        A[node].ans = max(A[node].ans, A[ls].right + A[rs].left);
    }
}

inline int query(int node) {
    return A[node].ans;
}

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

    f >> N >> M;
    buildTree(1, 1, N);
    for(int i = 1, t, x, y; i <= M; ++i) {
        f >> t;

        if(t == 3)
            g << query(1) << "\n";
        else {
            f >> x >> y;
            y += x - 1;
            if(t == 2)
                t = 1;
            else t = 0;
            update(1, 1, N, x, y, t);
        }
    }

    f.close();
    g.close();

    return 0;
}