#include<fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
long int m,n,p1,p2,temp,a[100001],b[200001],Max=0,c;
bool assume;
int maxim(int a,int b)
{
if(a<b) return b;
else return a;
}
void abc(int node,int start,int end)
{
int mid=(start+end)/2;
if(start == end) b[node]=a[c];
else if(mid+1<=c && c<=end)
{
abc(2*node+1, mid+1,end);
b[node]=maxim(b[2*node],b[2*node+1]);
}
else if(start<=c && c<=mid)
{
abc(2*node,start,mid);
b[node]=maxim(b[2*node], b[2*node+1]);
}
}
void search(int node,int start,int end,int p1,int p2)
{
int mid=(start+end)/2;
if(start==p1 && p2==end && Max<b[node]) Max=b[node];
else if(p1>=mid+1 && p2<=end) search(2*node+1,mid+1,end,p1,p2);
else if(p1>=start && p2<=mid) search(2*node,start,mid,p1,p2);
else if(p1<=mid+1 && p2<=end)
{
search(1,1,n,p1,mid);
search(2*node+1,mid+1,end,p1,p2);
}
else if(p1>=start && p2>mid)
{
search(1,1,n,mid+1,p2);
search(2*node,start,mid,p1,mid);
}
}
int main()
{
fin>>n>>m;
for(c=1;c<=n;c++)
{
fin>>a[c];
abc(1,1,n);
}
for(int i=0;i<m;i++)
{
fin>>assume>>p1>>p2;
if(assume==0)
{
Max=0;
search(1,1,n,p1,p2);
fout<<Max;
}
else if(assume==1)
{
c=p1;
temp=a[c];
a[c]=p2;
abc(1,1,n);
}
}
}