#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int aint[400001];
int arr[100001];
void build(int node,int st,int dr)
{
if(st==dr)
{
in>>aint[node];
return;
}
else
{
int mid=(st+dr)/2;
build(2*node,st,mid);
build(2*node+1,mid+1,dr);
}
aint[node]=max(aint[node*2],aint[node*2+1]);
}
void update(int pos,int val,int node,int st,int dr)
{
if(st==dr)
{
aint[node]=val;
return;
}
else
{
int mid=(st+dr)/2;
if(pos<=mid)
{
update(pos,val,2*node,st,mid);
}
else
{
update(pos,val,2*node+1,mid+1,dr);
}
aint[node]=max(aint[node*2],aint[node*2+1]);
}
}
int query(int a,int b,int node,int st,int dr)
{
if(st>b || dr<a)
{
return 0;
}
else if(a<=st && dr<=b)
{
return aint[node];
}
else
{
int mid=(st+dr)/2;
int val1=query(a,b,2*node,st,mid);
int val2=query(a,b,2*node+1,mid+1,dr);
return max(val1,val2);
}
}
int main()
{
int n,m;
in>>n>>m;
build(1,1,n);
int a,b,c;
for(int i=1; i<=m; i++)
{
in>>a>>b>>c;
if(a==0)
{
out<<query(b,c,1,1,n)<<endl;
}
else
{
update(b,c,1,1,n);
}
}
return 0;
}