Pagini recente » Cod sursa (job #2201207) | Cod sursa (job #1569178) | Istoria paginii runda/brasov_final_round/clasament | Cod sursa (job #2134556) | Cod sursa (job #1138128)
#include <iostream>
#include <fstream>
using namespace std;
#define MAXN 100005
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m;
int a[MAXN];
int sq[MAXN], size;
void update(int poz, int val)
{
a[poz] = val;
int i = (poz + size - 1) / size;
sq[i] = 0;
for (int j = size * (i - 1) + 1; j <= size * i; j++) {
sq[i] = max(sq[i], a[j]);
}
}
int query(int st, int dr)
{
int mx = 0;
for (int i = 1; i <= size; i++) {
if (st <= size * (i - 1) + 1 && size * i <= dr) {
mx = max(mx, sq[i]);
}
if (size * (i - 1) + 1 <= st && st <= size * i) {
for (int j = st; j <= dr; j++) {
mx = max(mx, a[j]);
}
return mx;
}
}
int i = (st + size - 1) / size;
if (mx < sq[i]) {
for (int j = st; j <= size * i; j++) {
mx = max(mx, a[j]);
}
}
i = (dr + size - 1) / size;
if (mx < sq[i]) {
for (int j = size * (i - 1) + 1; j <= dr; j++) {
mx = max(mx, a[j]);
}
}
return mx;
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; i++) {
f >> a[i];
}
size = 0;
while (size * size <= n) size++;
size--;
for (int i = 1; i <= size + 1; i++) {
sq[i] = 0;
for (int j = size * (i - 1) + 1; j <= size * i; j++) {
sq[i] = max(sq[i], a[j]);
}
}
for (int i = 1; i <= m; i++) {
int op, x, y;
f >> op >> x >> y;
if (op) {
update(x, y);
} else {
g << query(x, y) << '\n';
}
}
f.close();
g.close();
return 0;
}