#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int arb[4 * N], a[N];
void build(int st, int dr, int nod)
{
if(st == dr) {
arb[nod] = a[st];
return ;
}
int mid = (st + dr) >> 1;
build(st, mid, nod * 2);
build(mid + 1, dr, nod * 2 + 1);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
void update(int position, int val, int st, int dr, int nod)
{
if(st == dr) {
arb[nod] = val;
return ;
}
int mid = (st + dr) >> 1;
if(position <= mid) update(position, val, st, mid, nod * 2);
else update(position, val, mid + 1, dr, 2 * nod + 1);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
void query(int x, int y, int st, int dr, int nod, int & mx)
{
if(x <= st && dr <= y) {
mx = max(mx, arb[nod]);
return ;
}
int mid = (st + dr) >> 1;
if(x <= mid) query(x, y, st, mid, 2 * nod, mx);
if(mid + 1 <= y) query(x, y, mid + 1, dr, 2 * nod + 1, mx);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, mx = -1;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
build(1, n, 1);
for(int i = 1; i <= m; ++i) {
int type, x, y;
scanf("%d%d%d", &type, &x, &y);
if(type == 1) {
update(x, y, 1, n, 1);
}
else {
mx = -1;
query(x, y, 1, n, 1, mx);
printf("%d\n", mx);
}
}
return 0;
}