#include <bits/stdc++.h>
using namespace std;
const int sz=100005;
int n,m,c;
int aint[sz*4];
int a[sz];
void build(int nod,int st,int dr)
{
if(st==dr)
aint[nod]=a[st];
else
{
int mid=(st+dr)/2;
build(2*nod,st,mid);
build(2*nod+1,mid+1,dr);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
void update(int nod,int st,int dr,int pos,int val)
{
if(st==dr)
{
aint[nod]=val;
}
else
{
int mid=(st+dr)/2;
if(pos>mid)
{
update(nod*2+1,mid+1,dr,pos,val);
}
else
{
update(2*nod,st,mid,pos,val);
}
aint[nod]=max(aint[nod*2],aint[nod*2+1]);
}
}
int query(int nod,int st,int dr,int x,int y)
{
if(st>=x && y>=dr)
{
return aint[nod];
}
else
{
int mid=(st+dr)/2,l=0,r=0;
if(mid>=x)
{
l=query(nod*2,st,mid,x,y);
}
else if(mid+1<=y)
{
r=query(nod*2+1,mid+1,dr,x,y);
}
return max(l,r);
}
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
int op,x,y;
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin >> op >> x >> y;
if(op==0)
{
cout << query(1,1,n,x,y) << '\n';
}
else
{
update(1,1,n,x,y);
}
}
return 0;
}