Cod sursa(job #3144140)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 4 august 2023 18:21:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.64 kb
#include <bits/stdc++.h>

#define int long long

using namespace std;

class segment_tree {
    private:
        vector<int> tree;
    
    public:
        vector<int> a;
        int n;
        
        void init(const int &new_n) {
            n = new_n, a.resize(n + 1), tree.resize(4 * n + 1);
            for (int i = 1; i <= n; i++)
                cin >> a[i];
        }
        
        void build(const int &node, const int &left, const int &right) {
            if (left == right)
                tree[node] = a[left];
            else {
                int middle = (left + right) / 2;
                build(2 * node, left, middle);
                build(2 * node + 1, middle + 1, right);
                tree[node] = max(tree[2 * node], tree[2 * node + 1]);
            }
        }
        
        
        void update(const int &node, const int &left, const int &right, const int &position, const int &value) {
            if (position <= left && right <= position)
                tree[node] = value;
            else {
                int middle = (left + right) / 2;
                if (position <= middle)
                    update(2 * node, left, middle, position, value);
                if (middle < position)
                    update(2 * node + 1, middle + 1, right, position, value);
                tree[node] = max(tree[2 * node], tree[2 * node + 1]);
            }
        }
    
        int query(const int &node, const int &left, const int &right, const int &start, const int &finish) {
            if (start <= left && right <= finish)
                return tree[node];
            else {
                int middle = (left + right) / 2, ans = 0;
                if (start <= middle)
                    ans = max(ans, query(2 * node, left, middle, start, finish));
                if (middle < finish)
                    ans = max(ans, query(2 * node + 1, middle + 1, right, start, finish));
                return ans;
            }
        }
};

int n;
segment_tree tree;

void task1() {
    int left, right;
    cin >> left >> right;
    cout << tree.query(1, 1, n, left, right) << '\n';
}

void task2() {
    int position, value;
    cin >> position >> value;
    tree.update(1, 1, n, position, value);
}

signed main() {
    #ifndef TEST 
        freopen("arbint.in", "r", stdin);
        freopen("arbint.out", "w", stdout);
    #endif
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
  
    int q;
    cin >> n >> q;
    tree.init(n);
    tree.build(1, 1, n);
    while (q--) {
        int task;
        cin >> task;
        task++;
        if (task == 1)
            task1();
        else
            task2();
    }
    return 0;
}