#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M;
int tree[400005],v[100005];
int maxim(int a,int b)
{
if(a>b) return a;
return b;
}
void update_pos(int node,int st,int dr,int pos,int x)
{
if(st==dr)
{
tree[node]=x;
return;
}
int mij=(st+dr)/2;
if(pos<=mij) update_pos(node*2,st,mij,pos,x);
else update_pos(node*2+1,mij+1,dr,pos,x);
tree[node]=maxim(tree[node*2],tree[node*2+1]);
}
int query(int node,int st,int dr,int a,int b)
{
if(a<=st&&dr<=b)
{
return tree[node];
}
int mij=(st+dr)/2,rs=0,rd=0;
if(a<=mij)
rs=query(node*2,st,mij,a,b);
if(mij<b)
rd=query(node*2+1,mij+1,dr,a,b);
return maxim(rs,rd);
}
void pune(int node,int st,int dr)
{
if(st==dr)
{
tree[node]=v[st];
return;
}
int maxu=0;
for(int i=st;i<=dr;i++)
{
if(maxu<v[i]) maxu=v[i];
}
tree[node]=maxu;
int mij=(st+dr)/2;
pune(node*2,st,mij);
pune(node*2+1,mij+1,dr);
}
int main()
{
int x,y,z,t;
f>>N>>M;
for(int i=1;i<=N;i++)
{
f>>v[i];
update_pos(1,1,N,i,v[i]);
}
for(int j=1;j<=M;j++)
{
f>>x>>y>>z;
if(x==0)
{
g<<query(1,1,N,y,z)<<endl;
}
else
{
update_pos(1,1,N,y,z);
}
}
return 0;
}