Pagini recente » Cod sursa (job #3224885) | Cod sursa (job #683677) | Cod sursa (job #2245838) | Cod sursa (job #2186122) | Cod sursa (job #1197095)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
class SegTree
{
int n;
vector<int> t;
public:
SegTree(const vector<int> & a)
{
n = a.size();
t.resize(2*n);
for (int i = 0; i < n; ++i) {
t[n+i] = a[i];
}
for (int i = n-1; i >= 1; --i) {
t[i] = max(t[2*i], t[2*i+1]);
}
}
void update(int idx, int val)
{
idx += n;
t[idx] = val;
while (idx > 1) {
int tmp = max(t[idx], t[idx^1]);
idx /= 2;
if (t[idx] == tmp) {
break;
}
else {
t[idx] = tmp;
}
}
}
int getmax(int lo, int hi)
{
lo += n;
hi += n;
int ret = 0;
while (lo <= hi) {
ret = max(ret, max(t[lo], t[hi]));
lo = lo%2 == 0 ? lo/2 : lo/2+1;
hi = hi%2 == 1 ? hi/2 : hi/2-1;
}
return ret;
}
};
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;
}