#include <fstream>
#include <cstring>
#define X1 262145
using namespace std;
ifstream in;
ofstream out;
int v[X1];
inline void update(int nod,int L,int R,int pos,int val)
{
if(L==R&&L==pos) v[nod]=val;
else
{
int M=(L+R)/2;
if(pos<=M) update(2*nod,L,M,pos,val);
else update(2*nod+1,M+1,R,pos,val);
if(v[2*nod]>v[2*nod+1]) v[nod]=v[2*nod];
else v[nod]=v[2*nod+1];
}
}
inline int query(int nod,int L,int R,int a,int b)
{
if(a<=L&&R<=b) return v[nod];
else
{
int M=(L+R)/2,max1=0,max2=0;
if(a<=M) max1=query(2*nod,L,M,a,b);
if(b>M) max2=query(2*nod+1,M+1,R,a,b);
if(max1>max2) return max1;
else return max2;
}
}
int main()
{
int N,M,a,b,tip;
memset(v,0,sizeof(v));
in.open("arbint.in");
in>>N>>M;
for(int i=1;i<=N;++i)
{
in>>a;
update(1,1,N,i,a);
}
out.open("arbint.out");
for(;M;--M)
{
in>>tip>>a>>b;
if(tip==0) out<<query(1,1,N,a,b)<<'\n';
else update(1,1,N,a,b);
}
in.close();
out.close();
return 0;
}