Cod sursa(job #3349993)

Utilizator eric_dragosDragos Eric eric_dragos Data 4 aprilie 2026 12:45:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int Nmax = 1e5+1;
int n,m;
vector<int> a, st;

void build(int nod, int l, int r){
    if(l == r){
        st[nod] = a[l];
        return;
    }
    int m = (l+r)/2;
    build(2*nod, l, m);
    build(2*nod+1, m+1, r);

    st[nod] = max(st[2*nod], st[2*nod+1]);
}

void update(int nod, int i, int v, int l, int r){
    if(l == r){
        st[nod] = v;
        return;
    }
    int m = (l+r)/2;
    if(i <= m) update(2*nod, i, v, l, m);
    else update(2*nod+1, i, v, m+1, r);

    st[nod] = max(st[2*nod], st[2*nod+1]);
}

int query(int nod, int l, int r, int lx, int rx){
    if(r < lx || l > rx) return -1;
    if(l <= lx && rx <= r) return st[nod];
    int m = (lx+rx)/2;
    int val1 = query(2*nod, l, r, lx, m);
    int val2 = query(2*nod+1, l, r, m+1, rx);
    return max(val1, val2);
}

int main(){
    fin >> n >> m;
    a.resize(n);
    st.resize(4*n);
    for(int i = 0; i<n; i++){
        fin >> a[i];
    }
    build(1, 0, n-1);
    while(m--){
        int c, x, y;
        fin >> c >> x >> y;
        if(c == 0){
            fout << query(1, x-1, y-1, 0, n-1) << '\n';
        }
        else{
            update(1, x-1, y, 0, n-1);
        }
    }
    return 0;
}