#include <fstream>
#define DIM 300000
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int n,m;
int A[DIM];
int M[DIM];
void init(int v,int l,int r)
{
if(l==r)
M[v]=l;
else
{
init(2*v,l,(l+r)/2);
init(2*v+1,(l+r)/2+1,r);
if(A[M[2*v]]>=A[M[2*v+1]])
M[v]=M[2*v];
else
M[v]=M[2*v+1];
}
}
int query(int v,int st,int dr,int l,int r)
{
if(st>r || dr<l)
return -1;
if(st>=l&&dr<=r)
return M[v];
int p1=query(2*v,st,(st+dr)/2,l,r);
int p2=query(2*v+1,(st+dr)/2+1,dr,l,r);
if(p1==-1)
return p2;
if(p2==-1)
return p1;
if(A[p1]>=A[p2])
return p1;
return p2;
}
void update(int v,int l,int r,int poz,int val)
{
if(poz<l||poz>r)
return;
if(l==r)
{
A[l]=val;
return;
}
update(2*v,l,(l+r)/2,poz,val);
update(2*v+1,(l+r)/2+1,r,poz,val);
if(A[M[2*v]]>=A[M[2*v+1]])
M[v]=M[2*v];
else
M[v]=M[2*v+1];
}
int main()
{
fi>>n>>m;
for(int i=1;i<=n;i++)
fi>>A[i];
init(1,1,n);
for(int i=1;i<=m;i++)
{
int t,a,b;
fi>>t>>a>>b;
if(t==0)
fo<<A[query(1,1,n,a,b)]<<"\n";
else
update(1,1,n,a,b);
}
fi.close();
fo.close();
return 0;
}