Cod sursa(job #2990871)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 8 martie 2023 18:13:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <iostream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
class tree{
    public:
    std::vector<int> arr;
    tree(int dim){
        arr.resize(4*dim, 0);
    }
    void update(int node, int left, int right, int pos, int element);

    int query(int node, int left, int right, int L, int R);
};
int main()
{
    int n, m;
    fin >> n >> m;
    tree Tree(4*n);
    for(int i = 1; i <= n; i++){
        int el;
        fin >> el;
        Tree.update(1, 1, n, i, el);
    }
    for(int i = 1; i <= m; i++){
        int op, x, y;
        fin >> op >> x >> y;
        if(op == 0){
            fout << Tree.query(1, 1, n, x, y) << "\n";
        }
        else{
            Tree.update(1, 1, n, x, y);
        }
    }
    return 0;
}

void tree::update(int node, int left, int right, int pos, int element){
    if(left == right){
        arr[node] = element;
        return;
    }

    int mid = left + (right - left)/2;
    if(mid < pos) {
        update(node * 2 + 1, mid + 1, right, pos, element);
    }
    else {
        update(node * 2, left, mid, pos, element);
    }
    arr[node] = std::max(arr[node * 2], arr[node * 2 + 1]);
}

int tree::query(int node, int left, int right, int L, int R){
    if(L <= left && right <= R){
        return arr[node];
    }

    int mid = left + (right - left)/2;
    int value1 = 0, value2 = 0;
    if(L <= mid){
        value1 = query(node * 2, left, mid, L, R);
    }
    if(R > mid){
        value2 = query(node * 2 + 1, mid + 1, right, L, R);
    }

    return std::max(value1, value2);
}