#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int s[100000001];
int v[100000001];
void upd(int node,int from,int to,int pos,int val)
{
if(from==to)
{
s[node]=val;
return;
}
int mid=from+to;
mid=mid/2;
if(pos<=mid)
{
upd(node*2,from,mid,pos,val);
}
else
upd(node*2+1,mid+1,to,pos,val);
s[node]=max(s[node*2],s[node*2+1]);
}
int query(int node,int from,int to,int qleft,int qright)
{
int smax=0;
if(qleft > to || qright < from)
return 0;
if(qleft<=from && to<=qright)
return s[node];
int mid=(to+from)/2;
int s=query(node*2,from,mid,qleft,qright);
smax=max(s,smax);
s=query(node*2+1,mid+1,to,qleft,qright);
smax=max(s,smax);
return smax;
}
signed main()
{
int n,m;
int a,b,c;
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>v[i];
upd(1,1,n,i,v[i]);
}
for(int i=1;i<=m;i++)
{
fin>>a>>b>>c;
if(a==1)
{
upd(1,1,n,b,c);
}
else if(a==0)
{
fout<<query(1,1,n,b,c)<<endl;
}
}
return 0;
}