#include <cstdio>
#include <cmath>
#define max(a, b) ((a > b) ? (a) : (b))
#define MAX 100005
using namespace std;
long long arr[MAX], n, m;
long long arbore[4 * MAX + 1];
int max_intervals(int left, int right, int son) {
if (arbore[son])
return arbore[son];
if (left == right) {
arbore[son] = arr[left];
return arr[left];
}
int mid = (left + right) / 2;
arbore[son] = max(max_intervals(left, mid, 2 * son),
max_intervals(mid + 1, right, 2 * son + 1));
}
void update(int left, int right, int a, int b, int son) {
if (left == right) {
arbore[son] = b;
arr[left] = b;
return;
}
int mid = (left + right) / 2;
if (a <= mid)
update(left, mid, a, b, 2 * son);
else
update(mid + 1, right, a, b, 2 * son + 1);
arbore[son] = max(arbore[2 * son], arbore[2 * son + 1]);
}
int getMax(int left, int right,int a, int b, int son) {
if (a <= left and right <= b)
return arbore[son];
int mid = (left + right) / 2;
int Max = -1;
if (a <= mid)
Max = max(Max, getMax(left, mid, a, b, 2 * son));
if (b > mid)
Max = max(Max, getMax(mid + 1, right, a, b, 2 * son + 1));
return Max;
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1;i <= n;i ++)
scanf("%d", &arr[i]);
max_intervals(1, n, 1);
int operation, a, b;
for (int i = 1;i <= m;i ++) {
scanf("%d%d%d", &operation, &a, &b);
if (operation)
update(1, n, a, b, 1);
else
printf("%d\n",getMax(1, n, a, b, 1));
}
return 0;
}