Pagini recente » Cod sursa (job #2292859) | Cod sursa (job #2645104)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10; // 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;
}