Cod sursa(job #1059928)

Utilizator DanielSanduSandu Daniel DanielSandu Data 17 decembrie 2013 11:33:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <iostream>

std::ifstream in("arbint.in");
std::ofstream out("arbint.out");

int v[1000000], q;
size_t n;

void create(size_t node, size_t lhs, size_t rhs) {
    if (lhs == rhs) {
        in>>v[node];
        return;
    }
    create(node * 2, lhs, (lhs + rhs) / 2);
    create(node * 2 + 1, (lhs + rhs) / 2 + 1, rhs);
    v[node] = std::max(v[node * 2], v[node * 2 + 1]);
}

void max_arb(size_t node, size_t a, size_t b, size_t lhs, size_t rhs) {
    if (a <= lhs && rhs <= b) {
        if (v[node] > q)
            q = v[node];
    }
    else {
        size_t mid = (lhs + rhs) / 2;
        if (a <= mid)
            max_arb(node * 2, a, b, lhs, mid);
        if (mid + 1 <= b)
            max_arb(node * 2 + 1, a, b, mid + 1, rhs);
    }
}

void modify(int val, size_t pos, size_t node, size_t lhs, size_t rhs) {
    if (lhs == rhs)
        v[node] = val;
    else {
        size_t mid = (lhs + rhs) / 2;
        if (pos <= mid)
            modify(val, pos, node * 2, lhs, mid);
        else
            modify(val, pos, node * 2 + 1, mid + 1, rhs);
        v[node] = std::max(v[node * 2], v[node * 2 + 1]);
    }

}

int main() {
    size_t m, o, i, a, b;
    in>>n>>m;
    create(1, 1, n);
    for (i = 1; i <= m; ++i) {
        in>>o>>a>>b;
        if (o == 0) {
            q = 0;
            max_arb(1, a, b, 1, n);
            out<<q<<"\n";
        }
        else
            modify(b, a, 1, 1, n);
    }
    return 0;
}