Cod sursa(job #2242829)

Utilizator GeorgianBaditaBadita Marin-Georgian GeorgianBadita Data 19 septembrie 2018 16:58:56
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#define NMAX 100005
#define MAX(A, B) (A >= B ? A : B)
#define INF 1e9
using namespace std;

/*
 * FILES
 */
ifstream in("arbint.in");
ofstream out("arbint.out");

int arb[2*NMAX];
int n, m;

void update_tree(int node, int left, int right, int pos, int val){
    if(left == right){
        arb[node] = val;
        return;
    }
    int mid = (left + right) /  2;
    if(pos <= mid) {
        update_tree(2*node, left, mid, pos, val);
    }
    else{
        update_tree(2*node + 1, mid + 1, right, pos, val);
    }
    arb[node] = MAX(arb[2*node], arb[2*node + 1]);
}

int querry_tree(int node, int left, int right, int start, int finish){
    if(left >= start && right <= finish){
        return arb[node];
    }
    int mid = (left + right) / 2;
    if(start <= mid){
        return querry_tree(2*node, left, mid, start, finish);
    }
    if(finish > mid){
        return querry_tree(2*node + 1, mid + 1, right, start, finish);
    }
}

int main(){
    in >> n >> m;
    for(int i = 1; i<=n; i++){
        int x;
        in >> x;
        update_tree(1, 1, n, i, x);
    }
    for(int i = 1; i<=m; i++){
        int type, a, b;
        in >> type >> a >> b;
        switch (type) {
        case 0:
            out << querry_tree(1, 1, n, a, b) << '\n';
            break;
        case 1:
            update_tree(1, 1, n, a, b);
            break;
        default:
            break;
        }
    }
}