Cod sursa(job #1165317)

Utilizator tudorv96Tudor Varan tudorv96 Data 2 aprilie 2014 17:05:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
using namespace std;

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

const int N = 1e5 + 5;

#define mid ((lo + hi) >> 1)
#define nod1 (node << 1)
#define nod2 ((nod1) + 1)

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

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

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 MAX = -2e9;
    if (left <= mid)
        MAX = max(MAX, query (nod1, lo, mid, left, right));
    if (right > mid)
        MAX = max(MAX, query (nod2, mid + 1, hi, left, right));
    return MAX;
}

void create (int node, int lo, int hi) {
    if (lo == hi) {
        arb[node] = v[lo];
        return;
    }
    create (nod1, lo, mid);
    create (nod2, mid + 1, hi);
    arb[node] = max(arb[nod1], arb[nod2]);
}

int main() {
    fin >> n >> m;
    for (int x, i = 1; i <= n; ++i)
        fin >> v[i];
    create (1, 1, n);
    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);
    }
}