Cod sursa(job #2224758)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 24 iulie 2018 23:17:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <bits/stdc++.h>

using namespace std;

class SegmentTree{
private:
    vector<int> tree;
    int N;

    void build(int node, int l, int r, const vector<int> &v){
        if (l == r){
            tree[node] = v[l];
        }
        else{
            int m = (l + r) / 2;
            build(2 * node, l, m, v);
            build(2 * node + 1, m + 1, r, v);
            tree[node] = max(tree[2 * node], tree[2 * node + 1]);
        }
    }

    void update(int node, int l, int r, int pos, int value){
        if (l == r){
            tree[node] = value;
        }
        else{
            int m = (l + r) / 2;

            if (pos <= m)
                update(2 * node, l, m, pos, value);
            else
                update(2 * node + 1, m + 1, r, pos, value);

            tree[node] = max(tree[2 * node], tree[2 * node + 1]);
        }
    }

    int query(int node, int l, int r, int x, int y){
        if (x <= l && r <= y)
            return tree[node];
        else{
            int m = (l + r) / 2;

            if (x <= m && m < y)
                return max(query(2 * node, l, m, x, y),
                            query(2 * node + 1, m + 1, r, x, y));
            else if (x <= m)
                return query(2 * node, l, m, x, y);
            else
                return query(2 * node + 1, m + 1, r, x, y);
        }
    }

public:

    SegmentTree(const vector<int>& v){
        N = v.size();
        tree.resize(4 * N);
        build(1, 0, N - 1, v);
    }

    void update(int pos, int value){
        update(1, 0, N - 1, pos, value);
    }

    int query(int x, int y){
        return query(1, 0, N - 1, x, y);
    }

};

int main() {
//    ifstream cin("data.txt");
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

    ios_base::sync_with_stdio(false);

    int N, M;
    cin >> N >> M;

    vector<int> v(N);

    for (int &x: v)
        cin >> x;

    SegmentTree st(v);

    while (M--){
        int t, x, y;
        cin >> t >> x >> y;

        if (t == 0){
            cout << st.query(x - 1, y- 1) << "\n";
        }
        else{
            st.update(x - 1, y);
        }
    }


    return 0;
}