Cod sursa(job #1012748)

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

const int MAX_N = 100002;

int N, M;
int A[7*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) {
    int ans = 0;
    if(x <= left && right <= y)
        ans = A[node];
    else {
        int m = (left+right)/2;
        if(x <= m)
            ans = query(2*node, left, m, x, y);
        if(y > m)
            ans = max(ans,  query(2*node + 1, m+1, right, x, y));
    }

    return ans;
}

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

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

    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;
}