Cod sursa(job #1600440)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 15 februarie 2016 00:23:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;

int A[2 * 100000 + 10];

int query(int a, int b, int n) {
    int res = 0;
    for (a += n, b += n; a < b; a /= 2, b /= 2) {
        if (a % 2)
            res = max(res, A[a++]);
        if (b % 2)
            res = max(res, A[--b]);
    }
    return res;
}

void update(int a, int val, int n) {
    for (A[a += n] = val; a > 1; a /= 2)
        A[a / 2] = max(A[a], A[a ^ 1]);
}

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

    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i)
        scanf("%d", &A[i + n]);
    for (int i = n - 1; i >= 1; --i)
        A[i] = max(A[2 * i], A[2 * i + 1]);
    while (m--) {
        int op;
        int xx, yy;
        scanf("%d%d%d", &op, &xx, &yy);
        if (op == 0)
            printf("%d\n", query(xx - 1, yy, n));
        else
            update(xx - 1, yy, n);
    }
    return 0;
}