Pagini recente » Cod sursa (job #1999540) | Cod sursa (job #2553346) | Cod sursa (job #1966768) | Cod sursa (job #1847515) | Cod sursa (job #1929066)
#include <iostream>
#include <algorithm>
#include <fstream>
template <typename T>
class SegmentTree {
T *v;
int n;
T (*func)(T& val1, T& val2);
public:
SegmentTree(int n, T (*func)(T &val1, T &val2)) {
int pw;
for (pw = 1; pw <= n; pw <<= 1);
this->n = pw;
v = new T[2 * pw];
this->func = func;
for (int i = 0; i < 2 * pw; i++) {
v[i] = 0;
}
}
void update(int pos, T val) {
pos += n;
for (v[pos] = val; pos; pos >>= 1) {
v[pos >> 1] = func(v[pos], v[pos ^ 1]);
}
}
int query(int left, int right) {
T res = 0;
for (left += n, right += n; left < right; left >>= 1, right >>= 1) {
if (left & 1) {
res = func(res, v[left]);
left++;
}
if (right & 1) {
right--;
res = func(res, v[right]);
}
}
return res;
}
};
int main() {
std::ifstream cin("arbint.in");
std::ofstream cout("arbint.out");
int n, m, x, t, a, b;
cin >> n >> m;
SegmentTree<int> arbint(n+1, [](int &v1, int &v2) {return std::max(v1, v2); });
for (int i = 1; i <= n; i++) {
cin >> x;
arbint.update(i, x);
}
for (int i = 0; i < m; i++) {
cin >> t >> a >> b;
if (t == 1) {
arbint.update(a, b);
}
else {
cout << arbint.query(a, b + 1) << '\n';
}
}
return 0;
}