Cod sursa(job #3192050)

Utilizator not_anduAndu Scheusan not_andu Data 11 ianuarie 2024 12:44:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define INFILE "arbint.in"
#define OUTFILE "arbint.out"

const int N_MAX = 100005;

int n, queries;
int aint[4 * N_MAX];

void build(int node, int left, int right){

    if(left == right) cin >> aint[node];
    else{

        int middle = (left + right) >> 1;

        build(2 * node, left, middle);
        build(2 * node + 1, middle + 1, right);

        aint[node] = max(aint[2 * node], aint[2 * node + 1]);

    }

}

void update(int node, int left, int right, int position, int value){

    if(left == right) aint[node] = value;
    else{

        int middle = (left + right) >> 1;

        if(position <= middle) update(2 * node, left, middle, position, value);
        else update(2 * node + 1, middle + 1, right, position, value);

        aint[node] = max(aint[2 * node], aint[2 * node + 1]);

    }

}

int query(int node, int left, int right, int x, int y){

    if(x <= left && right <= y) return aint[node];

    int middle = (left + right) >> 1;

    if(y <= middle) return query(2 * node, left, middle, x, y);
    else if(x > middle) return query(2 * node + 1, middle + 1, right, x, y);
    return max(query(2 * node, left, middle, x, y), query(2 * node + 1, middle + 1, right, x, y));

}

void solve(){

    cin >> n >> queries;

    build(1, 1, n);

    for(int i = 0; i < queries; ++i){
        short type; ll x, y; cin >> type >> x >> y;
        if(type == 0) cout << query(1, 1, n, x, y) << '\n';
        else update(1, 1, n, x, y);
    }

}

int main(){
    ios_base::sync_with_stdio(false);
    freopen(INFILE, "r", stdin);
    freopen(OUTFILE, "w", stdout);
    cin.tie(0), cout.tie(0);
    solve();
    return 0;
}