#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
FILE *fin = fopen("arbint.in", "r"), *fout = fopen("arbint.out", "w");
#define MAX 100010
#define getmax(a, b) (a > b) ? a : b
#define getmin(a, b) (a < b) ? a : b
int v[MAX * 8], tree[MAX * 8], N, M;
void build(int nod, int st, int dr) {
if(st > dr)
return;
if(st == dr) {
tree[nod] = v[st];
return;
}
build(nod * 2, (st + dr) / 2 + 1, dr);
build(nod * 2 + 1, st, (st + dr) / 2);
tree[nod] = getmax(tree[nod * 2], tree[nod * 2 + 1]);
}
void update(int st, int dr, int nod, int val, int poz) {
if(st == dr) {
tree[nod] = val;
return;
}
int mid = (st + dr) >> 1;
if(poz <= mid)
update(st, mid, nod * 2, val, poz);
else
update(mid + 1, dr, nod * 2 + 1, val, poz);
tree[nod] = getmax(tree[nod * 2], tree[nod * 2 + 1]);
}
int quer;
void query(int c1, int c2, int st, int dr, int nod) {
if(c1 >= st && c2 <= dr) {
quer = getmax(quer, tree[nod]);
return;
}
int mid = (c1 + c2) >> 1;
if(st <= mid) {
query(c1, mid, st, dr, nod * 2);
}
if(dr > mid) {
query(mid + 1, c2, st, dr, nod * 2 + 1);
}
}
#define fi inline
#define BUF 1 << 17
int pos = BUF;
char buf[BUF];
fi char next() {
if(pos == BUF)
fread(buf, 1, BUF, fin), pos = 0;
return buf[pos++];
}
fi int read() {
int x = 0, semn = 1;
char c = next();
while(!isdigit(c) && c != '-')
c = next();
if(c == '-')
semn = -1, c = next();
while(isdigit(c)) {
x = x * 10 + c - '0';
c = next();
}
return x * semn;
}
int main() {
N = read(), M = read();
for(int i = 1;i <= N;i++) {
v[i] = read();
}
build(1, 1, N);
for(int i = 0;i < M;i++) {
int x, st, dr;
x = read(), st = read(), dr = read();
switch(x) {
case 0:
quer = 0;
query(1, N, st, dr, 1);
fprintf(fout, "%d\n", quer);
break;
case 1:
update(1, N, 1, dr, st);
}
}
fclose(fin);
fclose(fout);
return 0;
}