Pagini recente » Cod sursa (job #2737572) | Cod sursa (job #3143889) | Cod sursa (job #1636725) | Cod sursa (job #1386990) | Cod sursa (job #1109512)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
class SegmentTree {
public:
static const int oo = 0x3f3f3f3f;
SegmentTree(const vector<int> &values):
size(1),
tree(vector<int>()) {
for (; size < int(values.size()); size *= 2);
tree = vector<int>(2 * size, -oo);
for (int x = 0; x < int(values.size()); ++x)
tree[size + x] = values[x];
for (int x = size - 1; x > 0; --x)
tree[x] = max(tree[2 * x], tree[2 * x + 1]);
}
void Update(int where, const int value) {
tree[where += size] = value;
for (where /= 2; where > 0; where /= 2)
tree[where] = max(tree[2 * where], tree[2 * where + 1]);
}
int Query(int from, int to) const {
int answer = -oo;
from += size;
to += size;
while (from <= to) {
answer = max(answer, max(tree[from], tree[to]));
from = (from + 1) / 2;
to = (to - 1) / 2;
}
return answer;
}
private:
int size;
vector<int> tree;
};
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, q;
cin >> n >> q;
vector<int> values = vector<int>(n);
for (int i = 0; i < n; ++i)
cin >> values[i];
SegmentTree tree = SegmentTree(values);
for (; q > 0; --q) {
int type;
cin >> type;
if (type == 0) {
int from, to;
cin >> from >> to;
--from;
--to;
cout << tree.Query(from, to) << "\n";
} else {
int where, value;
cin >> where >> value;
--where;
tree.Update(where, value);
}
}
cin.close();
cout.close();
return 0;
}