Cod sursa(job #2783742)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 14 octombrie 2021 23:07:32
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 kb
/**
 *  Worg
 */
#include <vector>
#include <fstream>
#include <algorithm>

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

inline int left_son(int node) {
    return node << 1;
}

inline int right_son(int node) {
    return (node << 1) + 1;
}

inline int middle(int left, int right) {
    return (left + right) >> 1;
}

void initialize_stree(int node, int left, int right, std::vector<int>& stree) {
    if (left == right) {
        int elem;
        fin >> elem;
        stree[node] = elem;
    } else {
        initialize_stree(left_son(node), left, middle(left, right), stree);
        initialize_stree(right_son(node), middle(left, right) + 1, right, stree);
        stree[node] = std::max(stree[left_son(node)], stree[right_son(node)]);
    }
}

void update_stree(int node, int left, int right, int index, int value, std::vector<int>& stree) {
    if (left == right) {
        stree[node] = value;
    } else {
        if (index <= middle(left, right)) {
            update_stree(left_son(node), left, middle(left, right), index, value, stree);
        } else {
            update_stree(right_son(node), middle(left, right) + 1, right, index, value, stree);
        }
        stree[node] = std::max(stree[left_son(node)], stree[right_son(node)]);
    }
}

void query_stree(int node, int left, int right, int start, int end, int& query_answer, std::vector<int>& stree) {
    if (start <= left && right <= end) {
        query_answer = std::max(query_answer, stree[node]);
    } else {
        if (start <= middle(left, right)) {
            query_stree(left_son(node), left, middle(left, right), start, end, query_answer, stree);
        }
        if (end > middle(left, right)) {
            query_stree(right_son(node), middle(left, right) + 1, right, start, end, query_answer, stree);
        }
    }
}

std::vector<int> build_stree(int n) {
    std::vector<int> stree(4 * n, 0);
    initialize_stree(1, 1, n, stree);
    return stree;
}

int answer_query(int n, int start, int end, std::vector<int>& stree) {
    int answer = 0;
    query_stree(1, 1, n, start, end, answer, stree);
    return answer;
}

int main() {
    int n, m;
    fin >> n >> m;
    std::vector<int> stree = build_stree(n);

    for (int i = 0; i < m; i++) {
        int type, a, b;
        fin >> type >> a >> b;

        if (type == 0) {
            int answer = answer_query(n, a, b, stree);
            fout << answer << '\n';
        } else {
            update_stree(1, 1, n, a, b, stree);
        }
    }

    fin.close();
    fout.close();
    return 0;
}