Pagini recente » Cod sursa (job #83207) | Cod sursa (job #254740) | Cod sursa (job #601730) | Cod sursa (job #426206) | Cod sursa (job #1811712)
#include <bits/stdc++.h>
#define SZ(x) ((int) (x).size())
using namespace std;
template<class T>
struct SegmentedTree {
vector<T> tree;
int n;
SegmentedTree(const vector<T>& v) {
n = SZ(v);
while (n & (n - 1)) {
n += (n & -n);
}
tree.resize(2 * n);
copy(v.begin(), v.end(), tree.begin() + n);
for (int i = n - 1; i > 0; i--) {
tree[i] = max(tree[i << 1], tree[i << 1 | 1]);
}
}
void Update(int idx, const T& x) {
idx += n;
tree[idx] = x;
idx >>= 1;
while (idx > 0 and tree[idx] < x) {
tree[idx] = x;
idx >>= 1;
}
}
T Query(int left, int right) const {
T x = 0;
while (left > 0 and left + (left & -left) <= right) {
x = max(x, tree[(n + left) / (left & -left)]);
left += (left & -left);
}
while (right > left) {
x = max(x, tree[(n + right) / (right & -right) - 1]);
right -= (right & -right);
}
return x;
}
};
int main() {
#ifdef INFOARENA
ifstream cin("arbint.in");
ofstream cout("arbint.out");
#endif
cin.tie(0);
ios_base::sync_with_stdio(false);
int n, q; cin >> n >> q;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
SegmentedTree<int> ST(v);
for (int i = 0; i < q; i++) {
int qType, a, b; cin >> qType >> a >> b;
if (qType == 0) {
cout << ST.Query(a - 1, b) << '\n';
} else {
ST.Update(a - 1, b);
}
}
return 0;
}