Cod sursa(job #1766630)

Utilizator BaweeLazar Vlad Bawee Data 28 septembrie 2016 10:51:28
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <cstdio>

using namespace std;

int segment_tree[2 * 100001];
int a[100001];
const int oo = 99999999;
int m, n;

void recalculate(int node){
    segment_tree[node] = max(segment_tree[2 * node + 1], segment_tree[2 * node + 2]);
}

void build(int node, int left, int right){
    if(left == right) {
        segment_tree[node] = a[left];
    } else {
        int middle = (left + right) / 2;
        build(2 * node + 1, left, middle);
        build(2 * node + 2, middle + 1, right);
        recalculate(node);
    }
}

void update(int node, int left, int right, int x, int y){
    if(left == right) {
        segment_tree[node] = y;
    } else {
        int middle = (left + right) / 2;

        if(x <= middle) {
            update(2 * node + 1, left, middle, x , y);
        } else {
            update(2 * node + 2, middle + 1, right, x, y);
        }

        recalculate(node);
    }
}

int query(int node, int left, int right, int x, int y){
    if(x <= left and right <= y){
        return segment_tree[node];
    } else {
        int answer = -oo;
        int middle = (left + right) / 2;

        if(x <= middle) {
            answer = max(answer, query(2 * node + 1, left, middle, x, y));
        }

        if(y >= middle + 1){
            answer = max(answer, query(2 * node + 2, middle + 1, right, x, y));
        }

        return answer;
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int code, x, y;

    cin >> m >> n;
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
    }

    build(0, 1, n);

    for(int i = 1; i <= m; ++i){
        cin >> code >> x >> y;

        if(code == 0){
            cout << query(0, 1, n, x, y) << '\n';
        } else {
            update(0, 1, n, x, y);
        }
    }

    return 0;
}