Cod sursa(job #2834289)

Utilizator rusenmihai101@gmail.comMihai Rusen [email protected] Data 16 ianuarie 2022 19:33:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
using namespace std;

vector < int > Tree;

inline static void Update(int poz, int value, int n){
    Tree[poz + n - 1] = value;
    int i = (poz + n - 1) >> 1;
    for(; i; i >>= 1)
        Tree[i] = max(Tree[i << 1], Tree[i << 1 | 1]);
}

inline int MaximumQuery(int node, int left, int right, int q_left, int q_right){
    if(right < q_left || left > q_right)
        return 0;
    if(q_left <= left && right <= q_right)
        return Tree[node];
    int mid = (left + right) >> 1;
    return max(MaximumQuery(node << 1, left, mid, q_left, q_right),
               MaximumQuery(node << 1 | 1, mid + 1, right, q_left, q_right));
}

int main(){

    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n, Queries;
    cin >> n >> Queries;
    vector < int > a(n + 1);
    for(int i = 1; i <= n; ++i)
        cin >> a[i];
    while(__builtin_popcount(n) != 1){
        a.push_back(0);
        ++n;
    }
    Tree.resize((n << 1) + 1);
    for(int i = 1; i <= n; ++i)
        Tree[n + i - 1] = a[i];
    for(int i = n - 1; i >= 1; --i)
        Tree[i] = max(Tree[i << 1], Tree[i << 1 | 1]);
    int op, x, y;
    while(Queries--){
        cin >> op >> x >> y;
        if( ! op) // Query
            cout << MaximumQuery(1, 1, n, x, y) << '\n';
        else // Update
            Update(x, y, n);
    }

    return 0;
}