Pagini recente » Sosete | Arhiva de probleme | Taietura | Cod sursa (job #501314) | Cod sursa (job #1600440)
#include <bits/stdc++.h>
using namespace std;
int A[2 * 100000 + 10];
int query(int a, int b, int n) {
int res = 0;
for (a += n, b += n; a < b; a /= 2, b /= 2) {
if (a % 2)
res = max(res, A[a++]);
if (b % 2)
res = max(res, A[--b]);
}
return res;
}
void update(int a, int val, int n) {
for (A[a += n] = val; a > 1; a /= 2)
A[a / 2] = max(A[a], A[a ^ 1]);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i)
scanf("%d", &A[i + n]);
for (int i = n - 1; i >= 1; --i)
A[i] = max(A[2 * i], A[2 * i + 1]);
while (m--) {
int op;
int xx, yy;
scanf("%d%d%d", &op, &xx, &yy);
if (op == 0)
printf("%d\n", query(xx - 1, yy, n));
else
update(xx - 1, yy, n);
}
return 0;
}