Cod sursa(job #2672408)

Utilizator HumikoPostu Alexandru Humiko Data 13 noiembrie 2020 21:14:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
//Alex Postu

#include <bits/stdc++.h>

using namespace std;

static const int NMAX = 1e5;

int segTree[4*NMAX];

void update(int idx, int value, int leaf, int l, int r) {
    if ( l == r ) {
        segTree[leaf] = value;
        return;
    }

    int mid = l+(r-l)/2;

    if ( idx <= mid ) {
        update(idx, value, 2*leaf, l, mid);
    }
    else {
        update(idx, value, 2*leaf+1, mid+1, r);
    }

    segTree[leaf] = max(segTree[2*leaf], segTree[2*leaf+1]);
}

int query(int l, int r, int a, int b, int leaf) {
    if ( l >= a && b >= r ) {
        return segTree[leaf];
    }

    int answer = 0;
    int mid = l+(r-l)/2;

    if ( mid >= a ) {
        answer = max(answer, query(l ,mid, a, b, 2*leaf));
    }

    if ( mid < b ) {
        answer = max(answer, query(mid+1, r, a, b, 2*leaf+1));
    }

    return answer;
}

int main() {
#ifdef ONLINE_JUDGE
    freopen("input.in", "r", stdin);
    freopen("output.out", "w", stdout);
#else
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    int n, m;
    cin>>n>>m;

    for ( int i = 1; i <= n; ++i ) {
        int x;
        cin>>x;
        update(i, x, 1, 1, n);
    }

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

        if ( type == 0 ) {
            cout<<query(1, n, a, b, 1)<<'\n';
        }
        else {
            update(a, b, 1, 1, n);
        }
    }
}