# include <cstdio>
# include <algorithm>
using namespace std;
FILE *f = freopen("arbint.in", "r", stdin);
FILE *g = freopen("arbint.out", "w", stdout);
const int N_MAX = 100010;
int arb_int[4 * N_MAX];
int v[N_MAX];
int n, m;
void update(int nod, int start, int finish, int poz, int val)
{
if (start == finish)
{
if (start == poz)
arb_int[nod] = val;
}
else
{
int left_son = (nod<<1);
int right_son = left_son + 1;
int mid = (start + finish) / 2;
update(left_son, start, mid, poz, val);
update(right_son, mid+1, finish, poz, val);
arb_int[nod] = max(arb_int[left_son], arb_int[right_son]);
}
}
int query(int nod, int start, int finish, int left, int right)
{
if (left <= start && finish <= right)
return arb_int[nod];
int left_son = (nod<<1);
int right_son = left_son + 1;
int mid = (start + finish) / 2;
int ans = -1;
if (left <= mid)
ans = max(ans, query(left_son, start, mid, left, right));
if (right > mid)
ans = max(ans, query(right_son, mid+1, finish, left, right));
return ans;
}
void read()
{
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++)
{
scanf("%d", &v[i]);
update(1, 1, n, i, v[i]);
}
for (int i=1; i<=m; i++)
{
int t, x, y;
scanf("%d %d %d", &t, &x, &y);
if(t == 1)
update(1, 1, n, x, y);
else
{
int ans = query(1, 1, n, x, y);
printf("%d\n", ans);
}
}
}
int main()
{
read();
return 0;
}