Cod sursa(job #2645107)

Utilizator i_0__0_iNaimul i_0__0_i Data 27 august 2020 05:38:08
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;
 
const int N = 1e5 + 1000;  // limit for array size
const int SET = INT_MIN;
int start, n, m, x;  // 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(ceil(log2(n)));
    x = n;
    start = 1;
    if ((n & (n-1)) == 0 && n > 0) start = n;
    else while (x) x >>= 1, start <<= 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 a, b; cin >> x >> a >> b;
        if (x) {
            modify(a-1, b);
        } else {
            cout << query(a-1, b) << '\n';
        }
    }
    return 0;
}