Cod sursa(job #2121194)

Utilizator SenibelanMales Sebastian Senibelan Data 3 februarie 2018 13:59:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

const int NMAX = 100000 + 5;
int N, M;
int Arb[4 * NMAX];

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

int Query(int node, int left, int right, int a, int b){
    if(a <= left && right <= b)
        return Arb[node];
    int mid = (left + right) / 2;
    int newMax = 0;
    if(a <= mid)
        newMax = max(newMax, Query(node * 2, left, mid, a, b));
    if(b > mid)
        newMax = max(newMax, Query(node * 2 + 1, mid + 1, right, a, b));
    return newMax;
}

int main(){
    in >> N >> M;
    for(int i = 1; i <= N; ++i){
        int nr;
        in >> nr;
        Add(1, 1, N, nr, i);
    }
    for(int i = 1; i <= M; ++i){
        int o, a, b;
        in >> o >> a >> b;
        if(o == 0)
            out << Query(1, 1, N, a, b) << "\n";
        else
            Add(1, 1, N, b, a);
    }
}