#include <cstdio>
#define nmax 100010
int v[4*nmax], n, m, pos, val, start, finish, rs;
inline int max(int a, int b)
{
if (a>b) return a;
return b;
}
void update(int nod, int l, int r)
{
if (l==r) v[nod]=val; else
{
int m=(l+r)/2;
if (pos<=m) update(2*nod,l,m); else
update(2*nod+1,m+1,r);
v[nod]=max(v[2*nod], v[2*nod+1]);
}
}
int query(int nod, int l, int r)
{
if (start<=l && r<=finish)
rs=max(rs,v[nod]); else
{
int m=(l+r)/2;
if (start<=m) query(2*nod, l, m);
if (m<finish) query(2*nod+1, m+1, r);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
int i, t, a, b;
for (i=1; i<=n; i++)
{
scanf("%d",&val);
pos=i;
update(1,1,n);
}
while (m--)
{
scanf("%d %d %d",&t,&a,&b);
if (t==1)
{
pos=a;
val=b;
update(1,1,n);
} else
{
rs=-1;
start=a;
finish=b;
query(1,1,n);
printf("%d\n",rs);
}
}
}