#include <iostream>
#include <cstdio>
const char inFile[] = "arbint.in";
const char outFile[] = "arbint.out";
const int NMAX = 100002;
using namespace std;
int arb[5 * NMAX], n, m, value, target, maxi, intl, intr;
void update(int nod, int left, int right) {
if(left == right) {
arb[nod] = value;
return;
}
int mid = (left + right) / 2;
if(mid >= target)
update(nod * 2, left, mid);
else
update(nod * 2 + 1, mid + 1, right);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
void genMax(int nod, int left, int right) {
if(left >= intl && right <= intr) {
if(maxi < arb[nod]) maxi = arb[nod];
return;
}
int mid = (left + right) / 2;
if(mid >= intl)
genMax(nod * 2, left, mid);
if(mid < intr)
genMax(nod * 2 + 1, mid + 1, right);
}
int main()
{
int x, a, b;
freopen(inFile, "r", stdin);
//freopen(outFile, "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i) {
scanf("%d", &x);
target = i, value = x;
update(1, 1, n);
}
for(int i = 1; i <= m; ++i) {
scanf("%d %d %d", &x, &a, &b);
if(x == 1) {
target = a, value = b;
update(1, 1, n);
}
else {
intl = a, intr = b, maxi = 0;
genMax(1, 1, n);
printf("%d\n", maxi);
}
}
}