#include<stdio.h>
#define nmax 100002
int fa[nmax * 5], n, m, MAX, z, x, y;
int max(int a, int b)
{
if (a > b) return(a); else return(b);
}
void update(int nod, int left, int right, int val, int pos)
{
if (left == right)
{
fa[nod] = val;
return;
}
int k = (left + right) / 2;
if (pos <= k) update(nod << 1, left, k, val, pos);
else update((nod << 1) + 1, k + 1, right, val, pos);
fa[nod] = max(fa[nod << 1], fa[(nod << 1) + 1]);
}
void query(int nod, int left, int right, int a, int b)
{
if (a <= left && right <= b)
{
if (MAX < fa[nod]) MAX = fa[nod];
return;
}
int k = (left + right) / 2;
if (a <= k) query(nod << 1, left, k, a, b);
if (k < b) query((nod << 1) + 1, k + 1, right, a, b);
}
int main()
{
freopen("arbint.in","rt", stdin);
freopen("arbint.out", "wt", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &MAX);
update(1,1,n,MAX,i);
}
for (int i = 1; i <= m; ++i)
{
scanf("%d %d %d", &z, &x, &y);
if (z == 1)
update(1,1,n,y,x);
else
{
MAX = -1;
query(1,1,n,x,y);
printf("%d\n", MAX);
}
}
}