Cod sursa(job #3291811)

Utilizator AlfexAlex Florea Alfex Data 5 aprilie 2025 19:19:08
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>

using namespace std;

const int NMAX = 100002;
int N, M;
int a[NMAX], aint[4 * NMAX];

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

int query(int nod, int st, int dr, int qst, int qdr){
    if(dr < qst || st > qdr)
        return -1;
    if(st >= qst && dr <= qdr)
        return aint[nod];
    int ansSt, ansDr, m;
    m = (st + dr) / 2;
    ansSt = query(2 * nod, st, m, qst, qdr);
    ansDr = query(2 * nod + 1, m + 1, dr, qst, qdr);
    return max(ansSt, ansDr);
}

void update(int nod, int st, int dr, int poz, int val){
    if(poz < st || poz > dr)
        return;
    if(st == dr){
        aint[nod] = val;
        return;
    }
    int m = (st + dr) / 2;
    update(2 * nod, st, m, poz, val);
    update(2 * nod + 1, m + 1, dr, poz, val);
    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    freopen("aint.in", "r", stdin);
    freopen("aint.out", "w", stdout);
    cin >> N >> M;
    for(int i = 1; i <= N; i ++)
        cin >> a[i];
    build(1, 1, N);
    while(M --){
        int type, qst, qdr;
        cin >> type >> qst >> qdr;
        if(type == 0)
            cout << query(1, 1, N, qst, qdr) << '\n';
        else
            update(1, 1, N, qst, qdr);

    }
    return 0;
}