Pagini recente » Cod sursa (job #2389034) | Cod sursa (job #157615) | Cod sursa (job #476189) | Cod sursa (job #2702192) | Cod sursa (job #2157666)
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
#define NMAX 100005
#define SQRTMAX 360
int n, m, _sqrt, nb;
int a[NMAX], bucata[SQRTMAX];
#define which(i) (ceil(1.0 * i / _sqrt))
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];
void init() {
_sqrt = sqrt(n);
nb = which(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].sf = min(b[nb].sf, n);
}
void citire() {
for (int i = 1; i <= n; i++) {
scanf("%d ", &a[i]);
int k = which(i);
b[k].val = max(b[k].val, a[i]);
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d ", &n, &m);
init();
citire();
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 = which(pos);
if (val > b[k].val) b[k].val = val;
else b[k].recalc();
} else {
int st, dr;
scanf("%d %d ", &st, &dr);
int bSt = which(st), bDr = which(dr);
int query = 0;
if (st > b[bSt].inc) {
for (int i = st; i <= b[bSt].sf; i++)
query = max(query, a[i]);
} else if (st == b[bSt].inc) {
query = max(query, b[bSt].val);
}
for (int i = bSt + 1; i < bDr; i++)
query = max(query, b[i].val);
if (dr < b[bDr].sf) {
for (int i = b[bDr].inc; i <= dr; i++)
query = max(query, a[i]);
} else if (dr == b[bDr].sf) {
query = max(query, b[bDr].val);
}
printf("%d\n", query);
}
}
return 0;
}