#include <cstdio>
using namespace std;
#define maxim(a,b) ((a>b)?(a):(b))
#define NMAX 100015
int SegT[4*NMAX];
int Sol;
int N,M;
inline int left_son(int nod)
{
return nod<<1;
}
inline int right_son(int nod)
{
return (nod<<1)+1;
}
void Update(int nod, int left, int right, int val, int pos)
{
if(left==right)
{
SegT[nod] = val;
return;
}
int mid = (left+right)/2;
if(pos<=mid)
{
Update(left_son(nod),left,mid,val,pos);
SegT[nod] = SegT[left_son(nod)];
}
else
{
Update(right_son(nod),mid+1,right,val,pos);
SegT[nod] = maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
}
}
void Query(int nod, int left, int right, int beginI, int endI)
{
if(beginI<= left && right<=endI)
{
Sol = maxim(Sol,SegT[nod]);
return;
}
int mid = (left+right)/2;
if(beginI<=mid)
Query(left_son(nod),left,mid,beginI,endI);
if(endI>mid)
Query(right_son(nod),mid+1,right,beginI,endI);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1,x;i<=N;i++)
{
scanf("%d",&x);
Update(1,1,N,x,i);
}
for(int i=1,op,x,y;i<=M;i++)
{
scanf("%d%d%d",&op,&x,&y);
if(op)
Update(1,1,N,y,x);
else
{
Sol=-1;
Query(1,1,N,x,y);
printf("%d\n",Sol);
}
}
return 0;
}