Cod sursa(job #1012718)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 19 octombrie 2013 16:00:30
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
using namespace std;

const int MAX_N = 100002;

int N, M;
int v[MAX_N], A[MAX_N];

void update(int node, int left, int right, int x, int val) {
    if(left == x && x == right)
        A[node] = val;
    else {
        int m = (left+right)/2;
        if(x <= m)
            update(2*node, left, m, x, val);
        else update(2*node + 1, m+1, right, x, val);
        A[node] = max(A[2*node], A[2*node + 1]);
    }
}

int query(int node, int left, int right, int x, int y) {
    if(x <= left && right <= y)
        return A[node];
    else {
        int m = (left+right)/2;
        if(x <= left)
            return query(2*node, left, m, x, y);
        else if(m < y)
            return query(2*node + 1, m+1, right, x, y);
    }
}

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

    f >> N >> M;
    for(int i = 1; i <= N; ++i) {
        f >> v[i];
        update(1, 1, N, i, v[i]);
    }

    for(int i = 1; i <= M; ++i) {
        int t, x, y;
        f >> t >> x >> y;
        if(t == 0)
           g << query(1, 1, N, x, y) << "\n";
        else update(1, 1, N, x, y);
    }

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

    return 0;
}