Cod sursa(job #2500070)

Utilizator vxpsnVictor Pusnei vxpsn Data 27 noiembrie 2019 10:46:56
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

typedef long long ll;
typedef unsigned long long ull;

const ll nmx = 100005;
const ll inf = 1<<30;

class segmTree {
private:
    ll _val[4 * nmx];
    ll _nodes;

    void _upd(ll left, ll right, ll node, ll pos, ll val) {
        if(left == right) {
            _val[node] = val;
        }
        else {
            ll mid = (left + right) / 2;

            if(pos <= mid) _upd(left, mid, 2 * node, pos, val);
            else           _upd(mid + 1, right, 2 * node + 1, pos, val);

            _val[node] = max(_val[2 * node], _val[2 * node + 1]);
        }
    }
    void _query(ll left, ll right, ll node, ll l, ll r, ll &mx) {
        if(l <= left && right <= r) {
            mx = max(mx, _val[node]);
        }
        else {
            ll mid = (left + right) / 2;

            if(l <= mid) _query(left, mid, 2 * node, l, r, mx);
            if(r > mid) _query(mid + 1, right, 2 * node + 1, l, r, mx);
        }
    }
public:
    segmTree(ll n) {
        for(int i = 0; i < 4 * nmx; ++i) {
            _val[i] = 0;
        }
        _nodes = n;
    }
    void update(const ll &pos, const ll &val) {
        _upd(1, _nodes, 1, pos, val);
    }
    ll query(const ll &left, const ll &right) {
        ll mx = 0;
        _query(1, _nodes, 1, left, right, mx);
        return mx;
    }
};


int main() {
    ios::sync_with_stdio(0);

    ll N, M, v[nmx];

    in>>N>>M;

    segmTree tree(N);

    for(int i = 1; i <= N; ++i) {
        in>>v[i];
        tree.update(i, v[i]);
    }

    while(M--) {
        ll op, a, b;
        in>>op>>a>>b;
        if(op == 0) {
            out<<tree.query(a, b)<<"\n";
        }
        else {
            tree.update(a, b);
        }
    }

    return 0;
}