Cod sursa(job #2645098)

Utilizator i_0__0_iNaimul i_0__0_i Data 27 august 2020 03:37:19
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5;  // limit for array size
const int SET = INT_MIN;
int n, m, start;  // array size
int v[2 * N];

void build() {  // build the tree
    for (int i = start - 1; i > 0; --i) v[i] = max(v[i<<1], v[i<<1|1]);
}

void modify(int p, int value) {  // set value at position p
    for (v[p += start] = value; p > 1; p >>= 1) v[p>>1] = max(v[p], v[p^1]);
}

int query(int l, int r) {  // sum on interval [l, r)
    int res = INT_MIN;
    for (l += start, r += start; l < r; l >>= 1, r >>= 1) {
        if (l&1) res = max(res, v[l++]);
        if (r&1) res = max(res, v[--r]);
  }
  return res;
}

int32_t main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr);
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    cin >> n >> m;
    start = 1LL << int(floor(log2(n)) + 1);
    for (int i = 0; i < 2*N; i++) v[i] = SET;
    for (int i = 0; i < n; i++) cin >> v[start + i];
    build();
    while (m--) {
        int x, a, b; cin >> x >> a >> b;
        if (x) {
            modify(a-1, b);
        } else {
            cout << query(a-1, b) << '\n';
        }
    }
    return 0;
}