Cod sursa(job #3313684)

Utilizator DavidDiacDavid Diac DavidDiac Data 5 octombrie 2025 21:18:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX=1e5;

int aint[4*NMAX], a[NMAX];
int n, m;

void build(int nod, int st, int dr ) {
    if (st == dr) {
        aint[nod] = a[st];
    } else {
        int mij = (st + dr) / 2;
        build(2*nod, st, mij);
        build(2*nod+1, mij+1, dr);
        aint[nod] = max(aint[2*nod], aint[2*nod+1]);
    }
}
void update(int nod, int st, int dr, int pos, int val) {
    if (st == dr) {
        aint[nod] = val;
    } else {
        int mij = (st + dr) / 2;
        if (pos <= mij) {
            update(2*nod, st, mij, pos, val);
        } else {
            update(2*nod+1, mij+1, dr, pos, val);
        }
        aint[nod] = max(aint[2*nod], aint[2*nod+1]);
    }
}
int query(int nod, int st, int dr, int qst, int qdr) {
    if (st>=qst && dr<=qdr) {
        return aint[nod];
    }
    int mij = (st + dr) / 2, ans=0;
    if (qst<=mij) {
        ans=max(ans, query(2*nod, st, mij, qst, qdr));
    }
    if (mij<qdr) {
        ans=max(ans, query(2*nod+1, mij+1, dr, qst, qdr));
    }
    return ans;
}
int main() {
    int i, t, x, y;
    fin>>n>>m;
    for (i=1;i<=n;i++) {
        fin>>a[i];
    }
    build(1, 1, n);
    for (i=1;i<=m;i++) {
        fin>>t>>x>>y;
        if (t==1) {
            update(1, 1, n, x, y);
        } else {
            fout<<query(1, 1, n, x, y)<<endl;
        }
    }
    return 0;
}