#include <bits/stdc++.h>
using namespace std;
const int nmax=1e5+5;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
int V[4*nmax];
void update(int nod, int l, int r, int pos, int val)
{
if(l==r)V[nod]=val;
else
{
int mid=(l+r)/2;
if(pos<=mid)
update(2*nod,l,mid,pos,val);
else
update(2*nod+1,mid+1,r,pos,val);
V[nod]=max(V[2*nod],V[2*nod+1]);
}
}
int query(int nod, int l, int r, int x, int y)
{
int ans_l=0, ans_r=0;
if(l>=x && r<=y)
return V[nod];
else
{
int mid=(l+r)/2;
if(mid>=x)
ans_l=query(2*nod,l,mid,x,y);
if(mid<y)
ans_r=query(2*nod+1,mid+1,r,x,y);
return max(ans_l,ans_r);
}
}
int main()
{
int n,q;
fin >> n >> q;
for(int i=1 ; i<=n ; ++i)
{
int x;
fin >> x;
update(1,1,n,i,x);
}
for(int i=1 ; i<=q ; ++i)
{
int t,x,y;
fin >> t >> x >> y;
if(t==1)
update(1,1,n,x,y);
else
fout << query(1,1,n,x,y) << '\n';
}
return 0;
}