Pagini recente » Cod sursa (job #991493) | Cod sursa (job #264681) | Cod sursa (job #406308) | Cod sursa (job #2626752) | Cod sursa (job #942096)
Cod sursa(job #942096)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
class SegTree {
public:
SegTree( vector<int> a ) {
n = a.size();
for (size = 1; size < n; size *= 2);
seg.resize(2*size);
for (int i = 0; i < size; ++i) {
seg[size+i] = (i < n ? a[i] : 0);
}
for (int i = size-1; i > 0; --i) {
seg[i] = max( seg[2*i], seg[2*i+1] );
}
}
void update( int idx, int val ) {
idx += size;
seg[idx] = val;
for (idx /= 2; idx >= 1; idx /= 2) {
seg[idx] = max( seg[2*idx], seg[2*idx+1] );
}
}
int getmax( int lo, int hi ) {
lo += size;
hi += size;
int ret = 0;
while (lo <= hi) {
ret = max( ret, max( seg[lo], seg[hi] ) );
lo = (lo%2 == 0 ? lo/2 : lo/2+1);
hi = (hi%2 == 1 ? hi/2 : hi/2-1);
}
return ret;
}
vector<int> seg;
int size;
int n;
};
int main() {
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
fin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
fin >> a[i];
}
SegTree seg(a);
for (int i = 0; i < m; ++i) {
int op;
fin >> op;
if (op == 0) {
int lo, hi;
fin >> lo >> hi;
fout << seg.getmax(--lo, --hi) << '\n';
}
else {
int idx, val;
fin >> idx >> val;
seg.update(--idx, val);
}
}
return 0;
}