#include<fstream>
#include<iostream>
using namespace std;
const int NMAX=262144;
int ai[NMAX]={0};
inline int max(int a, int b)
{
if(a>=b)
return a;
return b;
}
void update(const int& nod, const int& a, const int& b, const int& index, const int& value)
{
if(a==b && b==index)
{
ai[nod]=value;
return;
}
int mid=a+(b-a)/2;
if(index<=mid)
update(2*nod+1,a,mid,index,value);
if(index>mid)
update(2*nod+2,mid+1,b,index,value);
ai[nod]=max(ai[2*nod+1],ai[2*nod+2]);
}
int query(const int& nod, const int& a, const int& b, const int& left, const int& right)
{
int mx=0;
if(left<=a && b<=right)
{
mx=max(ai[nod],mx);
return mx;
}
int mid=a+(b-a)/2;
if(left<=mid)
mx=max(query(2*nod+1,a,mid,left,right),mx);
if(right>mid)
mx=max(query(2*nod+2,mid+1,b,left,right),mx);
return mx;
}
int main()
{
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m,nr,tip,a,b;
in>>n>>m;
//Build the interval tree
for(int i=0;i<n;i++)
{
in>>nr;
update(0,0,n-1,i,nr);
}
for(int i=0;i<m;i++)
{
in>>tip>>a>>b;
if(tip==0)
{
--a,--b;
out<<query(0,0,n-1,a,b)<<"\n";
}
else
{
--a;
update(0,0,n-1,a,b);
}
}
in.close();
out.close();
}