Cod sursa(job #3357876)

Utilizator dragos_22Dragos-Radu Stiuca dragos_22 Data 13 iunie 2026 19:19:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <vector>

using namespace std;

int n,m;
vector<int> V;
vector<int> ArbInt;

void buildTree(int nod, int st, int dr){
    if(st == dr){
        ArbInt[nod] = V[st];
        return;
    }

    int mij = (st + dr)/2;
    buildTree(2*nod,st,mij);
    buildTree(2*nod+1,mij+1,dr);
    ArbInt[nod] = max(ArbInt[2*nod],ArbInt[2*nod+1]);
}

void afiseaza(int nod, int st, int dr, int nivel = 0) {
    cout << st << "," << dr << " = " << ArbInt[nod] << "\n";

    if (st == dr) return;

    int mij = (st + dr) / 2;
    afiseaza(2*nod, st, mij, nivel + 1);
    afiseaza(2*nod+1, mij+1, dr, nivel + 1);
}

void update(int nod, int st, int dr, int poz, int val){
    if(st == dr){
        ArbInt[nod] = val;
        V[poz] = val;
        return;
    }

    int mij = (st + dr)/2;

    if(poz <= mij)
        update(2*nod,st,mij,poz,val);
    else
        update(2*nod+1,mij+1,dr,poz,val);
    ArbInt[nod] = max(ArbInt[2*nod],ArbInt[2*nod+1]);
}


int query(int nod,int st,int dr,int a,int b){
    if(a <= st && dr <= b)
        return ArbInt[nod];

    int mij = (st + dr)/2;
    int rez = 0;

    if(a <= mij)
        rez = max(rez, query(2*nod,st,mij,a,b));
    if(b > mij)
        rez = max(rez, query(2*nod+1,mij+1,dr,a,b));
    return rez;
}


int main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    cin >> n >> m;
    V.resize(n+1);
    ArbInt.resize(4*n);

    for(int i = 1;i <= n; ++i)
        cin >> V[i];

    buildTree(1,1,n);

    /*update(1,1,n,4,7);
    for(int i = 1;i <= n; ++i)
        cout << V[i] << ' ';
    cout << '\n';
    afiseaza(1,1,n);*/

    for(int i = 0;i < m; ++i){
        int op,a,b;
        cin >> op >> a >> b;
        if(op == 0){
            cout << query(1,1,n,a,b) << "\n";
        }
        else{
            update(1,1,n,a,b);
        }
    }
    return 0;
}