#include <iostream>
#include <cstdio>
using namespace std;
#define DIM 400005
int arbint[DIM];
int N, M, nr, a, b, x, y, tip;
void update(int poz, int val, int nod, int in, int sf);
int query(int st, int dr, int nod, int in, int sf);
int main() {
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d\n", &N, &M);
for(int i = 1; i <= N; ++i) {
scanf("%d", &nr);
update(i, nr, 1, 1, N);
}
for(int i = 1; i <= M; ++i) {
scanf("%d", &tip);
if(tip == 0) {
scanf("%d %d\n", &x, &y);
cout << query(x, y, 1, 1, N) << '\n';
}
else {
scanf("%d %d\n", &a, &b);
update(a, b, 1, 1, N);
}
}
return 0;
}
void update(int poz, int val, int nod, int in, int sf) {
if(in == sf) {
if(in == poz) {
arbint[nod] = val;
}
return ;
}
update(poz, val, 2 * nod, in, (in + sf) / 2);
update(poz, val, 2 * nod + 1, (in + sf) / 2 + 1, sf);
arbint[nod] = max(arbint[nod * 2], arbint[nod * 2 + 1]);
}
int query(int st, int dr, int nod, int in, int sf) {
if(st <= in && sf <= dr) {
return arbint[nod];
}
int mij = (in + sf) / 2;
if(mij < st) {
return query(st, dr, 2 * nod + 1, mij + 1, sf);
}
if(mij >= dr) {
return query(st, dr, 2 * nod, in, mij);
}
return max(query(st, dr, 2 * nod, in, mij), query(st, dr, 2 * nod + 1, mij + 1, sf));
}