Pagini recente » Cod sursa (job #705114) | Cod sursa (job #790736) | Cod sursa (job #1654474) | Cod sursa (job #963042) | Cod sursa (job #983912)
Cod sursa(job #983912)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
template<class IntType>
class SegmentTree {
public:
SegmentTree(const vector<IntType> &values) {
for (size = 1; size < int(values.size()); size *= 2);
tree = vector<IntType>(2 * size + 1, 0);
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 IntType value) {
tree[where += size] = value;
for (where /= 2; where > 0; where /= 2)
tree[where] = max(tree[2 * where], tree[2 * where + 1]);
}
IntType Query(int from, int to) {
IntType answer = 0;
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<IntType> tree;
};
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, q;
vector<int> values;
cin >> n >> q;
values.resize(n);
for (int i = 0; i < n; ++i)
cin >> values[i];
SegmentTree<int> tree(values);
for (; q > 0; --q) {
int type, x, y;
cin >> type >> x >> y;
if (type == 1)
tree.Update(x - 1, y);
else
cout << tree.Query(x - 1, y - 1) << "\n";
}
cin.close();
cout.close();
return 0;
}