Pagini recente » Cod sursa (job #3365301) | Cod sursa (job #3367008) | Cod sursa (job #3366828) | Cod sursa (job #3366832) | Cod sursa (job #3364980)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
int arr[MAXN];
int n, m;
int maxInt[1005];
int lenGrup;
void update(int a, int b) {
int interval = (a - 1) / lenGrup;
int vechi = arr[a];
arr[a] = b;
if (b > maxInt[interval])
maxInt[interval] = b;
else if (vechi == maxInt[interval] && b < vechi) {
int st = interval * lenGrup + 1;
int dr = min(n, (interval + 1) * lenGrup);
maxInt[interval] = 0;
for (int i = st; i <= dr; ++i)
maxInt[interval] = max(maxInt[interval], arr[i]);
}
}
int query(int a, int b) {
int maxim = 0;
int intervalA = (a - 1) / lenGrup;
int intervalB = (b - 1) / lenGrup;
if (intervalA == intervalB) {
for (int i = a; i <= b; ++i)
maxim = max(maxim, arr[i]);
return maxim;
}
int endGrupA = (intervalA + 1) * lenGrup;
int startGrupB = intervalB * lenGrup + 1;
for (int i = a; i <= endGrupA; ++i)
maxim = max(maxim, arr[i]);
for (int i = intervalA + 1; i < intervalB; ++i)
maxim = max(maxim, maxInt[i]);
for (int i = startGrupB; i <= b; ++i)
maxim = max(maxim, arr[i]);
return maxim;
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
lenGrup = sqrt(n);
for (int i = 0; i <= (n / lenGrup) + 1; ++i)
maxInt[i] = 0;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
int interval = (i - 1) / lenGrup;
maxInt[interval] = max(maxInt[interval], arr[i]);
}
for (int i = 1; i <= m; ++i) {
int op, a, b;
cin >> op >> a >> b;
if (op == 0)
cout << query(a, b) << "\n";
else
update(a, b);
}
return 0;
}