import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
String in_file_name = "arbint.in";
String out_file_name = "arbint.out";
FileReader in_file = new FileReader(in_file_name);
FileWriter out_file = new FileWriter(out_file_name);
Scanner in = new Scanner(in_file);
PrintWriter out = new PrintWriter(out_file);
int M, N;
int a, b, c;
N = in.nextInt();
M = in.nextInt();
SegmentTree Tree = new SegmentTree(N);
for (int i = 1; i <= N; i++) {
a = in.nextInt();
Tree.update(i, a);
}
for (int i = 0; i < M; i++) {
a = in.nextInt();
b = in.nextInt();
c = in.nextInt();
if (a == 0) {
out.write(Tree.query(b, c) + "\n");
} else {
Tree.update(b, c);
}
}
in.close();
out.close();
}
}
class SegmentTree {
private final static int MAXN = 100010;
private int[] A = new int[MAXN * 4];
private final int N;
SegmentTree(int N) {
this.N = N;
}
void update(int pos, int val) {
update(1, 1, N, pos, val);
}
void update(int nod, int st, int dr, int pos, int val) {
if (st == dr) {
A[nod] = val;
} else {
int mid = (st + dr) / 2;
if (pos <= mid) {
update(nod * 2, st, mid, pos, val);
} else {
update(nod * 2 + 1, mid + 1, dr, pos, val);
}
A[nod] = Math.max(A[nod * 2], A[nod * 2 + 1]);
}
}
int query(int st, int dr) {
return query(1, 1, N, st, dr);
}
int query(int nod, int st, int dr, int a, int b) {
if (a <= st && dr <= b) {
return A[nod];
} else {
int mid = (st + dr) / 2;
int val1 = 0, val2 = 0;
if (a <= mid) {
val1 = query(nod * 2, st, mid, a, b);
}
if (mid < b) {
val2 = query(nod * 2 + 1, mid + 1, dr, a, b);
}
return Math.max(val1, val2);
}
}
}