Cod sursa(job #3311841)

Utilizator Razvan8888Popescu Razvan Razvan8888 Data 24 septembrie 2025 15:42:11
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

using namespace std;

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

int n, Q;

int v[200005], a[200005];

void build(int nod, int st, int dr){
    if(st == dr){
        a[nod] = v[st];
    }else{
        int m = (st + dr) / 2;
        build(2 * nod, st, m);
        build(2 * nod + 1, m + 1, dr);
        a[nod] = max(a[2 * nod], a[2 * nod + 1]);
    }
}

void update(int nod, int st, int dr, int index, int val){
    if(st == dr){
        a[nod] = val;
    }else{
        int m = (st + dr) / 2;
        if(st <= index && index <= m){
            update(2 * nod, st, m, index, val);
        }else{
            update(2 * nod + 1, m + 1, dr, index, val);
        }
        a[nod] = max(a[2 * nod], a[2 * nod + 1]);
    }
}

int query(int nod, int st, int dr, int c1, int c2){
    if(c2 < st || c1 > dr) return 0;
    if(st >= c1 && dr <= c2) return a[nod];
    int m = (st + dr) / 2;
    return max(query(2 * nod, st, m, c1 , c2), query(2 * nod + 1, m + 1, dr, c1, c2));
}

int main()
{
    in>>n>>Q;
    for(int i = 1; i <= n; i++)
        in>>v[i];
    int op, x, y;
    build(1, 1, n);
    for(int i = 1; i <= Q; i++){
        in>>op>>x>>y;
        if(op == 0){
            out<<query(1, 1, n, x, y)<<'\n';
        }else{
            update(1, 1, n, x, y);
        }
    }
    return 0;
}