#include <iostream>
#include <climits>
using namespace std;
#define MAXN 100000
int v[MAXN + 1];
int tree[4 * MAXN + 1];
void build(int nod, int st, int dr){
if (st == dr){
tree[nod] = v[st];
}
else{
int mij = (st + dr) / 2;
build(nod * 2, st, mij);
build(nod * 2 + 1, mij + 1, dr);
tree[nod] = max(tree[nod * 2], tree[nod * 2 + 1]);
}
}
int query(int nod, int st, int dr, int ql, int qr){
if (qr < st || ql > dr){
return INT_MIN;
}
if (ql <= st && dr <= qr){
return tree[nod];
}
int mij = (st + dr) / 2;
return max(query(nod * 2, st, mij, ql, qr), query(nod * 2 + 1, mij + 1, dr, ql, qr));
}
void update(int nod, int st, int dr, int poz, int val){
if (st == dr){
tree[nod] = val;
}
else{
int mij = (st + dr) / 2;
if (poz <= mij){
update(nod * 2, st, mij, poz, val);
}
else{
update(nod * 2 + 1, mij + 1, dr, poz, val);
}
tree[nod] = max(tree[nod * 2], tree[nod * 2 + 1]);
}
}
int main()
{
FILE *fin, *fout;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
int N, Q, i, val, X, Y;
fscanf(fin, "%d%d", &N, &Q);
for (i = 1; i <= N; i++){
fscanf(fin, "%d", &v[i]);
}
build(1, 1, N);
for (i = 1; i <= Q; i++){
fscanf(fin, "%d%d%d", &val, &X, &Y);
if (val == 0){
fprintf(fout, "%d\n", query(1, 1, N, X, Y));
}
else{
update(1, 1, N, X, Y);
}
}
fclose(fin);
fclose(fout);
return 0;
}