#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,i,tip,l,r,arb[4*100000+5],a[100000+10],pos,x;
void update(int node,int pos,int left,int right,int x)
{
if(left==right)
{
arb[node]=x;
return;
}
int mid=(left+right)/2;
if(pos<=mid)
{
update(node*2,pos,left,mid,x);
}
else
update(node*2+1,pos,mid+1,right,x);
arb[node] = max(arb[node*2],arb[node*2+1]);
}
int query(int node, int left,int right,int l,int r)
{
if(l<=left && right>=r)
return arb[node];
int mid=(left+right)/2;
int mx=-1;
if(l<mid)
{
mx=max(mx,query(node*2,left,mid,l,r));
}
if(mid<r)
{
mx=max(mx,query(node*2+1,mid+1,right,l,r));
}
return mx;
}
void create(int node, int left, int right)
{
if (left == right)
{
arb[node] = a[left];
return;
}
int mid = (left+right)/2;
create(node*2, left, mid);
create(node*2+1, mid+1, right);
arb[node]=max(arb[node*2],arb[node*2+1]);
}
int main()
{
f>>n>>m;
for(i=1; i<=n; i++)
{
f>>a[i];
}
create(1, 1, n);
for(i=1;i<=m;i++)
{
f>>tip;
if(tip==1)
{
f>>pos>>x;
update(1,pos,1,n,x);
}
else{
f>>l>>r;
g<<query(1,1,n,l,r)<<'\n';
}
}
return 0;
}