#include <bits/stdc++.h>
#define MAX 500000
using namespace std;
void update(int* T, int value, int node, int left, int right, int pos) {
if(left == right) {
T[node] = value;
return;
} else {
int mid = (left + right) / 2;
if(pos <= mid) {
update(T, value, 2 * node, left, mid, pos);
} else {
update(T, value, 2 * node + 1, mid + 1, right, pos);
}
}
T[node] = max(T[node * 2], T[node * 2 + 1]);
}
void query(int *T, int node, int left, int right, int a, int b, int &maxim) {
if(a <= left && b >= right) {
if(T[node] > maxim) {
maxim = T[node];
}
return;
}
int mid = (left + right) / 2;
if(a <= mid) {
query(T, 2 * node, left, mid, a, b, maxim);
}
if(b > mid) {
query(T, 2 * node + 1, mid + 1, right, a, b, maxim);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, x, a, b, maxim, cmd;
scanf("%d %d", &n, &m);
int T[MAX];
for(int i = 1; i <= n; i++) {
scanf("%d", &x);
update(T, x, 1, 1, n, i);
}
for(int i = 0; i < m; i++) {
scanf("%d %d %d", &cmd, &a ,&b);
if(cmd == 1) {
update(T, b, 1, 1, n, a);
} else {
maxim = -1;
query(T, 1, 1, n, a, b, maxim);
printf("%d\n", maxim);
}
}
return 0;
}