Cod sursa(job #3199319)

Utilizator gBneFlavius Andronic gBne Data 1 februarie 2024 14:57:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>

using namespace std;

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

int v[100003], A[400003];

void update(int nod, int l, int r, int poz, int val){
    if(l == r){
        A[nod] = val;
    }
    else{
        int mij = (l + r) / 2;
        int nodSt = 2 * nod, nodDr = 2 * nod + 1;
        if(poz <= mij){
            update(nodSt, l, mij, poz, val);
        }
        else{
            update(nodDr, mij + 1, r, poz, val);
        }
        A[nod] = max(A[nodSt], A[nodDr]);
    }
}

void build(int nod, int l, int r){
    if(l == r){
        A[nod] = v[l];
    }
    else{
        int mij = (l + r) / 2;
        int nodSt = 2 * nod, nodDr = 2 * nod + 1;
        build(nodSt, l, mij);
        build(nodDr, mij + 1, r);
        A[nod] = max(A[nodSt], A[nodDr]);
    }
}

int query(int nod, int l, int r, int ql, int qr){
    if(l >= ql && r <= qr){
        return A[nod];
    }
    else{
        int mij = (l + r) / 2;
        int nodSt = 2 * nod, nodDr = 2 * nod + 1;
        int rez1 = -1, rez2 = -1;
        if(ql <= mij){
            rez1 = query(nodSt, l, mij, ql, qr);
        }
        if(qr > mij){
            rez2 = query(nodDr, mij + 1, r, ql, qr);
        }
        return max(rez1, rez2);
    }

}

int main()
{
    int n, m;
    fin >> n >> m;
    for(int i=1; i<=n; i++){
        fin >> v[i];
    }
    build(1, 1, n);
    for(int c, a, b, i=1; i<=m; i++){
        fin >> c >> a >> b;
        if(c == 0){
            fout << query(1, 1, n, a, b) << '\n';
        }
        else{
            update(1, 1, n, a, b);
        }
    }
    return 0;
}