Cod sursa(job #2211898)

Utilizator DordeDorde Matei Dorde Data 12 iunie 2018 12:56:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#define inf (1 << 30)
using namespace std;
int const NM = 1e6 + 7;
int V [NM] , aint [NM];
inline void build (int node , int from , int to){
    if (from < to){
        int mid = (from + to) >> 1;
        build (node * 2 + 1 , from , mid);
        build (node * 2 , mid + 1 , to);
        aint [node] = max (aint [node * 2] , aint [node * 2 + 1]);
    }
    else
        aint [node] = V [from];
}
inline int update (int node , int from , int to , int a , int b){
    if (from < to){
        int mid = (from + to) >> 1;
        if (a <= mid)
            update (node * 2 + 1 , from , mid , a , b);
        else
            update (node * 2 , mid + 1 , to , a , b);
        aint [node] = max (aint [node * 2 + 1] , aint [node * 2]);
    }
    else
        aint [node] = b;
}
inline int query (int node , int from , int to , int a , int b){
    if (to < a or from > b)
        return -inf;
    if (to <= b && from >= a)
        return aint [node];
    int mid = (from + to) >> 1;
    return max (query (node * 2 + 1 , from , mid , a , b) , query (node * 2 , mid + 1 , to , a , b));
}
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
int main (){
    int i , n , j , q;
    cin >> n >> q;
    for(i = 1 ; i <= n ; ++ i)
        cin >> V [i];
    build (1 , 1 , n);
    for(i = 1 ; i <= q ; ++ i){
        int a , b , p;
        cin >> p >> a >> b;
        if (p == 0)
            cout << query (1 , 1 , n , a , b) << '\n';
        else
            update (1 , 1 , n , a , b);
    }
}