Pagini recente » Cod sursa (job #223024) | Cod sursa (job #2200912) | Cod sursa (job #2379830) | Cod sursa (job #2392068) | Cod sursa (job #2279763)
#include <iostream>
#include <fstream>
#include <vector>
#define MAXVAL 1000000005
using namespace std;
class SegmentTree {
public:
SegmentTree(const vector<int> &arr) {
N_arr = arr.size();
seg = vector<int>(2 * N_arr, 0);
for (int i = 0; i < N_arr; ++i) {
seg[i + N_arr] = arr[i];
}
for (int i = N_arr - 1; i > 0; --i) {
seg[i] = max(seg[2 * i], seg[2 * i + 1]);
}
}
void update(int ix, int val) {
int seg_ix = ix + N_arr;
seg[seg_ix] = val;
for (int i = seg_ix; i > 1; i = i / 2) {
int p = i / 2;
seg[p] = max(seg[2*p+1], seg[2*p]);
}
}
int query(int l, int r) {
int ret = -1;
l += N_arr;
r += N_arr + 1; //inclusive
while (l < r) {
if (l % 2 == 1) {
ret = max(ret, seg[l]);
l++;
}
if (r % 2 == 1) {
r--;
ret = max(ret, seg[r]);
}
l = l / 2;
r = r / 2;
}
return ret;
}
private:
vector<int> seg;
int N_arr;
};
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int N, M;
scanf("%d %d", &N, &M);
vector<int> arr(N, 0);
for (int i = 0; i < N; ++i) {
int n;
scanf("%d", &n);
arr[i] = n;
}
SegmentTree seg(arr);
for (int i = 0; i < M; ++i) {
int t, n1, n2;
scanf("%d %d %d", &t, &n1, &n2);
if (t == 0) {
printf("%d\n", seg.query(n1-1, n2-1));
} else {
seg.update(n1-1,n2);
}
}
return 0;
}