Pagini recente » Cod sursa (job #402295) | Cod sursa (job #865495) | Cod sursa (job #1825532) | Cod sursa (job #636642) | Cod sursa (job #2271309)
#include <cstdio>
#include <algorithm>
class SegmentTree {
public:
int value;
int leftIndex;
int rightIndex;
SegmentTree* left;
SegmentTree* right;
void build(int nodeLeft, int nodeRight) {
leftIndex = nodeLeft;
rightIndex = nodeRight;
int mid = (nodeLeft + nodeRight) >> 1;
if (leftIndex != rightIndex) {
left = new SegmentTree;
left->build(nodeLeft, mid);
right = new SegmentTree;
right->build(mid + 1, nodeRight);
}
}
void update(int pos, int newValue) {
if (leftIndex == rightIndex)
value = newValue;
else {
int mid = (leftIndex + rightIndex) >> 1;
if (pos <= mid)
left->update(pos, newValue);
else
right->update(pos, newValue);
value = std::max(left->value, right->value);
}
}
int query(int qLeft, int qRight) {
if (qLeft <= leftIndex && rightIndex <= qRight)
return value;
else {
int mid = (leftIndex + rightIndex) >> 1;
int ans = 0;
if (qLeft <= mid)
ans = std::max(ans, left->query(qLeft, qRight));
if (qRight > mid)
ans = std::max(ans, right->query(qLeft, qRight));
return ans;
}
}
};
SegmentTree* root = new SegmentTree;
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
root->build(1, n);
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
root->update(i, x);
}
for (int i = 1; i <= m; i++) {
int t, a, b;
scanf("%d%d%d", &t, &a, &b);
if (t == 0) {
printf("%d\n", root->query(a, b));
} else {
root->update(a, b);
}
}
return 0;
}