#include <fstream>
#include <map>
#include <vector>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 1000005;
int aint[NMAX],n,v[NMAX];
void init(int node,int left,int right){
if(left == right)
{
aint[node] = v[left];
return;
}
int mid = left + (right - left) / 2;
init(2 * node,left,mid);
init(2 * node + 1,mid + 1,right);
aint[node] = max(aint[2 * node],aint[2 * node + 1]);
}
void update(int node,int left,int right,int poz,int val){
if(left == right)
{
aint[node] = val;
return;
}
int mid = left + (right - left) / 2;
if(mid >= poz)
update(2 * node,left,mid,poz,val);
else
update(2 * node + 1,mid +1,right,poz,val);
aint[node] = max(aint[2 * node],aint[2 * node + 1]);
}
int query(int node,int left,int right,int leftq,int rightq){
if(leftq <= left && right <= rightq)
return aint[node];
int mid = left + (right - left) / 2,ans1,ans2;
ans1 = ans2 = 0;
if(leftq <= mid)
ans1 = query(2 * node,left, mid,leftq,rightq);
if(rightq > mid)
ans2 = query(2 * node + 1,mid + 1,right,leftq,rightq);
return max(ans1,ans2);
}
int main()
{
int m;
fin>>n>>m;
int q,x,y;
for(int i = 1;i <= n;i++)
{
fin>>v[i];
}
init(1,1,n);
for(int i = 1;i <= m;i++){
fin>>q>>x>>y;
if(q == 0)
fout<<query(1,1,n,x,y)<<"\n";
else
update(1,1,n,x,y);
}
return 0;
}