import java.io.File;
import java.util.Scanner;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
public final class Main {
private static final int NO_ENTRY = -1;
public final static void main(final String[] args) throws IOException {
final Scanner in = new Scanner(new File("arbint.in"));
final BufferedWriter out = new BufferedWriter(new FileWriter("arbint.out"));
final int N = in.nextInt();
final int Q = in.nextInt();
final int[] tree = new int[2 * N - 1];
for (int it = 0; it < tree.length; ++it) {
tree[it] = NO_ENTRY;
}
for (int it = 0; it < N; ++it) {
final int value = in.nextInt();
insertValue(value, it, it, tree, 0, 0, N - 1);
}
//printTree(tree);
for (int it = 0; it < Q; ++it) {
final int qType = in.nextInt();
final int a = in.nextInt();
final int b = in.nextInt();
if (0 == qType) {
final int qResult = max(a - 1, b - 1, tree, 0, 0, N - 1);
out.write(qResult + "\n");
} else {
insertValue(b, a - 1, a - 1, tree, 0, 0, N - 1);
//printTree(tree);
}
}
in.close();
out.flush();
out.close();
}
private static final void printTree(final int[] tree) {
for (int it = 0; it < tree.length; ++it) {
System.out.print(tree[it] + " ");
}
System.out.println();
}
private static final void insertValue(final int value, final int vStart, final int vEnd, final int[] tree, final int tCurrent, final int tStart, final int tEnd) {
if (vStart <= tStart && tEnd <= vEnd) {
//System.out.println("Write [" + tCurrent + "]: " + value);
tree[tCurrent] = value;
return;
}
final int middle = tStart + (tEnd - tStart) / 2;
if (vStart <= middle && left(tCurrent) < tree.length) {
insertValue(value, vStart, vEnd, tree, left(tCurrent), tStart, middle);
}
if (middle < vEnd && right(tCurrent) < tree.length) {
insertValue(value, vStart, vEnd, tree, right(tCurrent), 1 + middle, tEnd);
}
tree[tCurrent] = NO_ENTRY;
if (left(tCurrent) < tree.length) {
tree[tCurrent] = Math.max(tree[tCurrent], tree[left(tCurrent)]);
}
if (right(tCurrent) < tree.length) {
tree[tCurrent] = Math.max(tree[tCurrent], tree[right(tCurrent)]);
}
}
private static final int left(final int of) {
return 1 + 2 * of;
}
private static final int right(final int of) {
return 2 + 2 * of;
}
private static final int max(final int iStart, final int iEnd, final int[] tree, final int tCurrent, final int tStart, final int tEnd) {
if (iStart <= tStart && tEnd <= iEnd) {
//System.out.println("Return for (" + iStart + ", " + iEnd + "): " + tree[tCurrent]);
return tree[tCurrent];
}
int leftMax = NO_ENTRY, rightMax = NO_ENTRY;
final int middle = tStart + (tEnd - tStart) / 2;
if (iStart <= middle && left(tCurrent) < tree.length) {
//System.out.println("Goint left for (" + iStart + ", " + middle + ")");
leftMax = max(iStart, iEnd, tree, left(tCurrent), tStart, middle);
}
if (middle < iEnd && right(tCurrent) < tree.length) {
//System.out.println("Goint left for (" + 1 + middle + ", " + tEnd + ")");
rightMax = max(iStart, iEnd, tree, right(tCurrent), 1 + middle, tEnd);
}
return Math.max(leftMax, rightMax);
}
}