Cod sursa(job #3125847)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 4 mai 2023 17:43:40
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[400500];
int v[100005];
int M;
/*void build(int nod, int st, int dr){
    if(st == dr){
        arb[nod] = v[st];
        return;
    }
    int med = (st + dr) / 2;
    build(2 * nod,st, med);
    build(2 * nod + 1, med + 1, dr);
    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}*/
void update(int nod, int st, int dr, int poz, int val){
    if(st == dr){
        arb[nod] = val;
        return;
    }
    int med = (st + dr) / 2;
    if(st <= poz && med >= poz) update(2 * nod, st, med, poz, val);
    if(med + 1 <= poz, dr >= poz) update(2 * nod + 1, med + 1, dr, poz, val);
    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
void query(int nod, int st, int dr, int l, int r){
    if(st >= l && dr <= r){
        if(arb[nod] > M) M = arb[nod];
        return;
    }
    int med = (st + dr) / 2;
    if(l <= med) query(2 * nod,st, med, l, r);
    if(med < r) query(2 * nod + 1, med + 1, dr, l, r);
}
int main()
{
    int n,m,i,j,k,c,poz,val;
    fin >> n >> m;
    for(i = 1; i <= n; i++){
        fin >> v[i];
        update(1,1,n,i,v[i]);
    }
    for(i = 1; i <= m; i++){
        fin >> c >> poz >> val;
        if(c == 0){
            M = 0;
            query(1,1,n,poz,val);
            fout << M << "\n";
        }
        else update(1,1,n,poz,val);
    }
    return 0;
}