Cod sursa(job #2187244)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 26 martie 2018 12:28:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int aint[400005] , v[100005];
int n , m , a , b , p , sol;
void build(int nod , int st , int dr) {
    if(st == dr)
        aint[nod] = v[st];
    else {
        int med = (st + dr) / 2;
        build(2 * nod , st , med);
        build(2 * nod + 1 , med + 1 , dr);
        aint[nod] = max(aint[2 * nod] , aint[2 * nod + 1]);
    }
}
void update(int nod , int st , int dr , int pozv , int new_val) {
    if(st == dr)
        aint[nod] = new_val;
    else {
        int med = (st + dr) / 2;
        if(pozv <= med)
            update(2 * nod , st , med , pozv , new_val);
        if(pozv >= med + 1)
            update(2 * nod + 1 , med + 1 , dr , pozv , new_val);
        aint[nod] = max(aint[2 * nod] , aint[2 * nod + 1]);
    }
}
void query(int nod , int st , int dr , int a , int b) {
    if(a <= st && dr <= b)
        sol = max(sol , aint[nod]);
    else {
        int med = (st + dr) / 2;
        if(a <= med)
            query(2 * nod , st , med , a , b);
        if(b >= med + 1)
            query(2 * nod + 1 , med + 1 , dr , a , b);
    }
}
int main() {
    freopen("arbint.in" , "r" , stdin);
    freopen("arbint.out" , "w" , stdout);
    int i;
    scanf("%d%d" , &n , &m);
    for(i = 1 ; i <= n ; i ++)
        scanf("%d" , &v[i]);
    build(1 , 1 , n);
    for(i = 1 ; i <= m ; i ++) {
        scanf("%d%d%d" , &p , &a , &b);
        if(p == 0) {
            sol = 0;
            query(1 , 1 , n , a , b);
            printf("%d\n" , sol);
        } else
            update(1 , 1 , n , a , b);
    }
    return 0;
}