#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int A[100010];
void Update (int nod, int st, int dr, int pos, int val){
if (st==dr){
A[nod]=val;
return;
}
int mij = (st+dr) >> 1;
if (pos<= mij){
Update(nod << 1, st, mij, pos, val);
}
else{
Update((nod << 1)+1, mij+1, dr, pos, val);
}
A[nod]= max (A[nod << 1], A[(nod<<1)+1]);
}
void Query (int nod, int st, int dr, int a, int b,int &MAX)
{
if(st>=a && dr<=b)
{
MAX = max(MAX, A[nod]);
return;
}
int mij=(st+dr)/2;
if (mij<b){
Query(2*nod+1,mij+1,dr,a,b,MAX);
}
if (mij>=a){
Query(2*nod,st,mij,a,b,MAX);
}
}
int main()
{
int n,m;
cin>>n>>m;
for (int i=1; i<=n; i++){
int val;
cin>>val;
Update (1,1,n,i,val);
}
for (int i=1; i<=m; i++){
int x, a, b;
cin>>x>>a>>b;
if (x==0){
int MAX=0;
Query(1,1,n,a,b,MAX);
cout<<MAX<<'\n';
}
else{
Update(1,1,n,a,b);
}
}
return 0;
}