Pagini recente » Cod sursa (job #166754) | Cod sursa (job #750273) | Cod sursa (job #1666794) | Cod sursa (job #477433) | Cod sursa (job #2157617)
// vim: tabstop=2:shiftwidth=2:expandtab:syntax=off
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
#define NMAX 100005
#define SQRTMAX 360
int n, m, _sqrt;
int a[NMAX], bucata[SQRTMAX];
struct Bucata {
int inc, sf, val;
void recalc() {
int res = 0;
for (int i = inc; i <= sf; i++)
res = max(res, a[i]);
val = res;
}
}b[SQRTMAX];
int nb;
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d ", &n, &m);
_sqrt = sqrt(n);
nb = ceil(n / sqrt(n));
b[1].inc = 1;
b[1].sf = _sqrt;
for (int i = 2; i < nb; i++) {
b[i].inc = b[i - 1].sf + 1;
b[i].sf = b[i].inc + _sqrt - 1;
b[i].val = 0;
}
b[nb].inc = b[nb - 1].sf + 1;
b[nb].sf = n;
for (int i = 1; i <= n; i++) {
scanf("%d ", &a[i]);
int k = ceil(i * 1.0 / _sqrt);
b[k].val = max(b[k].val, a[i]);
}
for (int i = 1; i <= m; i++) {
int tip;
scanf("%d ", &tip);
if (tip == 1) {
int pos, val;
scanf("%d %d ", &pos, &val);
a[pos] = val;
int k = ceil(i * 1.0 / _sqrt);
if (val > b[k].val)
b[k].val = val;
else
b[k].recalc();
} else {
int st, dr;
scanf("%d %d ", &st, &dr);
int bSt = ceil(st * 1.0 / _sqrt);
int bDr = ceil(dr * 1.0 / _sqrt);
int query = 0;
for (int i = st; i <= b[bSt].sf; i++)
query = max(query, a[i]);
for (int i = b[bDr].inc; i <= dr; i++)
query = max(query, a[i]);
for (int i = bSt + 1; i < bDr; i++)
query = max(query, b[i].val);
printf("%d\n", query);
}
}
return 0;
}