Cod sursa(job #1826784)

Utilizator horatiucheval2Horatiu Andrei Cheval horatiucheval2 Data 10 decembrie 2016 21:08:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
using namespace std;

const int MAX = 100000;


void update(int tree[], int left, int right, int node, int val, int pos){
    if(left == right){
        tree[node] = val;
    }else{
        int mid = (left + right) / 2;
        if(pos <= mid){
            update(tree, left, mid, 2 * node, val, pos);
        }else{
            update(tree, mid + 1, right, 2 * node + 1, val, pos);
        }
        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
}

int query(int tree[], int left, int right, int node, int a, int b){
    if(a <= left && right <= b){
        return tree[node];
    }else{
        int mid = (left + right) / 2;
        int m1 = -1, m2 = -1;
        if(a <= mid){
            m1 = query(tree, left, mid, 2 * node, a, b);
        }
        if(mid < b){
            m2 = query(tree, mid + 1, right, 2 * node + 1, a, b);
        }
        return max(m1, m2);
    }
}


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

    int n, m;
    int tree[8 * MAX];
    fin >> n >> m;



    for(int i = 1; i <= n; i++){
        int x;
        fin >> x;
        update(tree, 1, n, 1, x, i);
    }

    for(int i = 1; i <= m; i++){
        int op, a, b;
        fin >> op >> a >> b;
        if(op == 0){
            fout << query(tree, 1, n, 1, a, b) << "\n";
        }else if(op == 1){
            update(tree, 1, n, 1, b, a);
        }
    }

    fin.close();
    fout.close();
    return 0;
}