Pagini recente » Istoria paginii utilizator/titusboga | Monitorul de evaluare | Cod sursa (job #2515511) | kontrollarbeit1 | Cod sursa (job #2684966)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100001;
struct SegmentTree {
int leftmost, rightmost;
int value;
SegmentTree *left, *right;
SegmentTree(int leftmost, int rightmost, int v[]) : leftmost(leftmost), rightmost(rightmost) {
if (leftmost == rightmost) {
value = v[leftmost];
return;
}
int mid = leftmost + (rightmost - leftmost) / 2;
left = new SegmentTree(leftmost, mid, v);
right = new SegmentTree(mid + 1, rightmost, v);
recompute();
}
~SegmentTree() {
if (leftmost == rightmost) {
return;
}
delete left;
delete right;
}
void recompute() {
if (leftmost == rightmost) {
return;
}
value = max(left->value, right->value);
}
void update(int index, int newValue) {
if (leftmost == rightmost) {
value = newValue;
return;
}
if (index <= left->rightmost) {
left->update(index, newValue);
} else {
right->update(index, newValue);
}
recompute();
}
int query(int l, int r) {
if (l > rightmost || r < leftmost) {
return INT_MIN;
}
if (l <= leftmost && r >= rightmost) {
return value;
}
return max(left->query(l, r), right->query(l, r));
}
};
int n, m, arr[NMAX];
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d ", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d ", &arr[i]);
}
SegmentTree *tree = new SegmentTree(1, n, arr);
while (m--) {
int type, a, b;
scanf("%d %d %d ", &type, &a, &b);
if (type == 0) {
printf("%d\n", tree->query(a, b));
} else {
tree->update(a, b);
}
}
return 0;
}