Cod sursa(job #1165310)

Utilizator tudorv96Tudor Varan tudorv96 Data 2 aprilie 2014 16:57:37
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

const int N = 1e5;

int arb[N*3], n, m;

void update (int node, int lo, int hi, int poz, int x) {
    if (lo == hi) {
        arb[node] = x;
        return;
    }
    int mid = (lo + hi) >> 1;
    if (poz <= mid)
        update (node * 2, lo, mid, poz, x);
    else
        update (node * 2 + 1, mid + 1, hi, poz, x);
    arb[node] = max(arb[node*2], arb[node*2+1]);
}

int query (int node, int lo, int hi, int left, int right) {
    if (lo > right || hi < left)
        return -2e9;
    if (left <= lo && hi <= right)
        return arb[node];
    int mid = (lo + hi) >> 1, MAX = -2e9;
    if (left <= mid)
        MAX = max(MAX, query (node * 2, lo, mid, left, right));
    if (right > mid)
        MAX = max(MAX, query (node * 2 + 1, mid + 1, hi, left, right));
    return MAX;
}

int main() {
    fin >> n >> m;
    for (int x, i = 1; i <= n; ++i) {
        fin >> x;
        update (1, 1, n, i, x);
    }
    for (int t, x, y, i = 0; i < m; ++i) {
        fin >> t >> x >> y;
        if (!t)
            fout << query(1, 1, n, x, y) << "\n";
        else
            update (1, 1, n, x, y);
    }
}