#include <cstdio>
#include <vector>
#define MAX_N 1001
using namespace std;
int arb[MAX_N], n, m;
void update(int *arb, int val, int poz, int nod, int s, int d) {
if(s == d) {
arb[nod] = val;
return;
}
int mj = (s + d) / 2;
if(poz <= mj)
update(arb, val, poz, 2 * nod, s, mj);
else
update(arb, val, poz, 2 * nod+ 1, mj + 1, d);
arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
void find(int *arb, int nod, int s, int d, int rs, int rd, int *sol) {
if(s >= rs && d <= rd) {
if(*sol < arb[nod])
*sol = arb[nod];
return;
}
int mj = (s + d) / 2;
if(rs <= mj)
find(arb, 2 * nod, s, mj, rs, rd, sol);
if(rd > mj)
find(arb, 2 * nod + 1, mj + 1, d, rs, rd, sol);
}
int main() {
FILE *f = fopen("arbint.in", "r");
FILE *g = fopen("arbint.out", "w");
int arb[MAX_N], aux, op, a, b, sol;
fscanf(f, "%d%d", &n, &m);
for(int i = 1; i <= n; i ++) {
fscanf(f, "%d", &aux);
update(arb, aux, i, 1, 1, n);
}
for(int i = 1; i <= m; i ++) {
fscanf(f, "%d%d%d", &op, &a, &b);
if(op==0) {
sol=0;
find(arb, 1, 1, n, a, b, &sol);
fprintf(g, "%d\n", sol);
}
if(op==1)
update(arb, b, a, 1, 1, n);
}
return 0;
}