#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int m,n,p1,p2,temp,x,a[100001],b[100001];
int Max=0;
bool assume;
int maxim(int a,int b)
{
if(a<b) return b;
else return a;
}
void abc(int node,int y,int z)
{
int mid=(y+z)/2;
if(y==z) b[node]=a[x];
else if(y<=x && x<=mid)
{
abc(2*node,y,mid);
b[node]=maxim( b[2*node] , b[2*node+1] );
}
else if(mid+1<=x && x<=z)
{
abc(2*node+1,mid+1,z);
b[node]= maxim( b[2*node] , b[2*node+1] );
}
}
void search(int node,int y,int z,int p1,int p2)
{
int mid=(y+z)/2;
if(y==p1 && z==p2) if(Max<b[node]) Max=b[node];
else if(p1>=z && p2<=mid) search(2*node, y, mid, p1, p2);
else if(p1>=mid+1 && p2<=z) search(2*node+1, mid+1, z, p1, p2);
else if(p1>=y && p2>mid)
{
search(1, 1, n, mid+1, p2);
search(2*node, y, mid, p1, mid);
}
else if(p1<=mid+1 && p2<=z)
{
search(1,1,n,p1,mid);
search(2*node+1,mid+1,z,p1,p2);
}
}
int main()
{
fin>>n>>m;
for(x=1;x<=n;x++)
{
fin>>a[x];
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)
{
x=p1;
a[x]=p2;
temp=a[x];
abc(1,1,n);
}
}
}