#include <bits/stdc++.h>
#define oo 1000000001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int aint[400005],a[100005];
void Build(int node,int left,int right)
{
if(left==right)
{
aint[node]=a[left];
return ;
}
int mid=(left+right)/2;
Build(2*node+1,left,mid);
Build(2*node+2,mid+1,right);
aint[node]=max(aint[2*node+1],aint[2*node+2]);
}
void Update(int node,int left,int right,int x,int y)
{
if(left==right)
{
aint[node]=y;
return ;
}
int mid=(left+right)/2;
if(x<=mid)Update(2*node+1,left,mid,x,y);
else Update(2*node+2,mid+1,right,x,y);
aint[node]=max(aint[2*node+1],aint[2*node+2]);
}
int Querry(int node,int left,int right,int x,int y)
{
if(x<=left && right<=y)
return aint[node];
int answer=-oo;
int mid=(left+right)/2;
if(x<=mid)answer=max(answer,Querry(2*node+1,left,mid,x,y));
if(y>=mid+1)answer=max(answer,Querry(2*node+2,mid+1,right,x,y));
return answer;
}
int main()
{
int i,op,x,y;
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>a[i];
Build(0,1,n);
while(m--)
{
fin>>op>>x>>y;
if(op==0)fout<<Querry(0,1,n,x,y)<<"\n";
else Update(0,1,n,x,y);
}
return 0;
}