Cod sursa(job #2596203)

Utilizator segtreapMihnea Andreescu segtreap Data 9 aprilie 2020 13:54:48
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int N = 131072;
int n;
int q;
int tree[2 * N + 7];

void update(int i, int x) {
        i = (i + n - 1);
        tree[i] = x;
        i /= 2;
        while (i) {
                tree[i] = max(tree[2 * i], tree[2 * i + 1]);
                i /= 2;
        }
}

int query(int l, int r) {
        int ans = 0;
        l = n + l - 1;
        r = n + r - 1;
        while (l <= r) {
                if (l % 2 == 1) {
                        ans = max(ans, tree[l]);
                        l++;
                }
                if (r % 2 == 0) {
                        ans = max(ans, tree[r]);
                        r--;
                }
                l /= 2;
                r /= 2;
        }
        return ans;
}

int main() {
        freopen ("arbint.in", "r", stdin);
        freopen ("arbint.out", "w", stdout);

        scanf("%d %d", &n, &q);
        int init = n;
        int lg = log2(n);
        if ((1 << lg) != n) {
                n = (1 << (lg + 1));
        }
        for (int i = 1; i <= init; i++) {
                int x;
                scanf("%d", &x);
                update(i, x);
        }
        for (int i = 1; i <= q; i++) {
                int t, a, b;
                scanf("%d %d %d", &t, &a, &b);
                if (t == 0) {
                        printf("%d\n", query(a, b));
                } else {
                        update(a, b);
                }
        }
}