Cod sursa(job #3357278)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 8 iunie 2026 01:27:27
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>\n#include <fstream>\n#include <vector>\n#include <algorithm>\n\nusing namespace std;\n\nconst int MAXN = 100005;\nint n, m;\nvector<int> a(MAXN);\nvector<vector<int>> tree(4 * MAXN);\n\nvoid build(int node, int start, int end) {\n    if (start == end)\n        tree[node] = {a[start], a[start]};\n    else {\n        int mid = (start + end) / 2;\n        build(2 * node, start, mid);\n        build(2 * node + 1, mid + 1, end);\n        tree[node][0] = max(tree[2 * node][0], tree[2 * node + 1][0]);\n        tree[node][1] = min(tree[2 * node][1], tree[2 * node + 1][1]);\n    }\n}\n\nvoid update(int node, int start, int end, int idx, int val) {\n    if (start == end)\n        a[idx] = tree[node][0] = tree[node][1] = val;\n    else {\n        int mid = (start + end) / 2;\n        if (idx <= mid)\n            update(2 * node, start, mid, idx, val);\n        else\n            update(2 * node + 1, mid + 1, end, idx, val);\n        tree[node][0] = max(tree[2 * node][0], tree[2 * node + 1][0]);\n        tree[node][1] = min(tree[2 * node][1], tree[2 * node + 1][1]);\n    }\n}\n\nint query(int node, int start, int end, int l, int r) {\n    if (r < start || end < l)\n        return INT_MIN;\n    if (l <= start && end <= r)\n        return tree[node][0];\n    int mid = (start + end) / 2;\n    int left = query(2 * node, start, mid, l, r);\n    int right = query(2 * node + 1, mid + 1, end, l, r);\n    return max(left, right);\n}\n\nint main() {\n    ifstream fin(\"arbint.in\");\n    ofstream fout(\"arbint.out\");\n\n    fin >> n >> m;\n    for (int i = 0; i < n; ++i)\n        fin >> a[i];\n\n    build(1, 0, n - 1);\n\n    for (int i = 0; i < m; ++i) {\n        int op, x, y;\n        fin >> op >> x >> y;\n        if (op == 0)\n            fout << query(1, 0, n - 1, x - 1, y - 1) << '\\n';\n        else\n            update(1, 0, n - 1, x - 1, y);\n    }\n\n    return 0;\n}