#include <iostream>
#include <stdio.h>
using namespace std;
int n,m;
int arbore[500040];
int x[100010];
void citire()
{
freopen("arbint.in","r",stdin);
scanf("%d %d",&n,&m);
for(int i=0; i<n; i++)
scanf("%d",&x[i]);
}
int creare_arbore(int st, int dr,int k)
{
if(st==dr)
return arbore[k]=x[st];
int mij=(st+dr)/2;
return arbore[k]=max(creare_arbore(st,mij,k*2),creare_arbore(mij+1,dr,k*2+1));
}
int a,b;
int update(int st, int dr, int k)
{
if(st==dr && st==a)
return arbore[k]=b;
int mij=(st+dr)/2;
if(a<=mij)
{
update(st,mij,k*2);
return arbore[k]=max(arbore[2*k],arbore[2*k+1]);
}
update(mij+1,dr,k*2+1);
return arbore[k]=max(arbore[2*k],arbore[2*k+1]);
}
int ma=-1;
void srch(int st, int dr, int k)
{
if(st>=a && b>=dr)
{
if(arbore[k]>ma)
ma=arbore[k];
return;
}
int mij=(st+dr)/2,p=-1,q=-1;
if(a<=mij)
srch(st,mij,k*2);
if(b>=mij+1)
srch(mij+1,dr,2*k+1);
}
int main()
{
freopen("arbint.out","w",stdout);
citire();
creare_arbore(0,n-1,1);
int op;
for(int i=0; i<m; i++)
{
scanf("%d %d %d",&op,&a,&b);
if(op==1)
{
a--;
update(0,n-1,1);
}
else
{
a--,b--;
ma=-1;
if(a>b)
swap(a,b);
srch(0,n-1,1);
printf("%d\n",ma);
}
}
return 0;
}