Pagini recente » Cod sursa (job #2364945) | Cod sursa (job #746302) | Cod sursa (job #845897) | Cod sursa (job #2389413) | Cod sursa (job #2279752)
#include <iostream>
#include <fstream>
#include <vector>
#define MAXVAL 1000000005
using namespace std;
//typedef long T;
class SegmentTree {
public:
SegmentTree(const vector<int> &arr) {
N_arr = arr.size();
seg = vector<int>(N_arr, 0);
for (int i = 0; i < N_arr; ++i) {
seg.push_back(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() {
ifstream iff("arbint.in");
ofstream off("arbint.out");
int N, M;
iff >> N >> M;
vector<int> arr;
for (int i = 0; i < N; ++i) {
int n;
iff >> n;
arr.push_back(n);
}
SegmentTree seg(arr);
for (int i = 0; i < M; ++i) {
int t, n1, n2;
iff >> t >> n1 >> n2;
if (t == 0) {
off << seg.query(n1-1,n2-1) << endl;
} else {
seg.update(n1-1,n2);
}
}
return 0;
}