#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int N=100000+5;
int n,q;
int a[3*N];
inline void upd(int nod,int id,int value,int st,int dr)
{
if(id<st || dr<id)
{
return;
}
if(st==dr)
{
a[nod]=value;
return;
}
int med=(st+dr)/2;
upd(2*nod,id,value,st,med);
upd(2*nod+1,id,value,med+1,dr);
a[nod]=max(a[2*nod],a[2*nod+1]);
}
inline int ask(int nod,int aa,int b,int st,int dr)
{
if(dr<aa || b<st)
{
return -(1<<30);
}
if(aa<=st && dr<=b)
{
return a[nod];
}
int med=(st+dr)/2;
return max(ask(2*nod,aa,b,st,med),ask(2*nod+1,aa,b,med+1,dr));
}
int main()
{
fin>>n>>q;
for(int i=1;i<=n;i++)
{
int x;
fin>>x;
upd(1,i,x,1,n);
}
while(q--)
{
int t,a,b;
fin>>t>>a>>b;
if(t==0)
{
fout<<ask(1,a,b,1,n)<<"\n";
}
else
{
upd(1,a,b,1,n);
}
}
return 0;
}