Cod sursa(job #2904600)

Utilizator memitaBeniamin Vasile memita Data 18 mai 2022 00:12:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

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

int lista[100001];
int arb[400004];

void build (int nod, int s, int d)
{
    if (s == d){
        arb[nod] = lista[s];
        //cout << s << '-'<< d <<' '<< arb[nod] << endl;
    }
    else{
        int mij = (s + d) / 2;
        build(2*nod, s, mij);
        build(2*nod+1, mij+1, d);
        arb[nod] = max(arb[2*nod],arb[2*nod+1]);
        //cout << s << '-'<< d <<' '<< arb[nod] << endl;
    }
}
void update (int nod, int s, int d, int indx, int val)
{
    if (s == d){
        lista[indx] = val;
        arb[nod] = val;
    }
    else{
        int mij = (s + d) / 2;
        if (s <= indx && indx <= mij)
            update(2*nod, s, mij, indx, val);
        else
            update(2*nod+1, mij+1, d, indx, val);
        arb[nod] = max(arb[2*nod],arb[2*nod + 1]);
    }
}
int query(int nod, int s, int d, int l, int r)
{
    if (r < s || d < l )
        return 0;
    if (l <= s && d <= r)
        return arb[nod];

    int mij = (s + d) / 2;
    int p1 = query(2*nod, s, mij, l, r);
    int p2 = query(2*nod+1, mij+1, d, l, r);
    return max(p1, p2);
}
int main()
{
    int nr, op, i, cod, a, b;
    fin >> nr >> op;

    for (i = 1; i <= nr; i++)
        fin >> lista[i];

    build(1, 1, nr);

    for (i = 1; i <= op; i++){
        fin >> cod >> a >> b;
        if (cod == 0)
            fout << query(1, 1, nr, a, b) <<"\n";
        else
            update(1, 1, nr, a, b);
    }
    return 0;
}