#include <fstream>
#include <iostream>
#define nmax 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[nmax],n,m;
int tree[2*nmax];
void BuildTree(int pos,int val,int node,int left,int right)
{ if(left==right) {tree[node]=val; return;}
int mid=(left+right)/2;
if(pos<=mid) BuildTree(pos,val,node*2,left,mid);
else BuildTree(pos,val,node*2+1,mid+1,right);
tree[node]=max(tree[node*2],tree[node*2+1]);
}
void ChangeVal(int pos,int val,int node,int left,int right)
{ if(left==pos && right==pos) {tree[node]=val; return; }
int mid=(left+right)/2;
if(pos<=mid) BuildTree(pos,val,node*2,left,mid);
else BuildTree(pos,val,node*2+1,mid+1,right);
tree[node]=max(tree[node*2],tree[node*2+1]);
}
void Max(int node,int left,int right,int in,int fin,int &mx)
{ if(in<=left && right<=fin)
{ if(tree[node]>mx) mx=tree[node];
return;
}
int mid=(left+right)/2;
if(in<=mid) Max(node*2,left,mid,in,fin,mx);
if(mid<fin) Max(node*2+1,mid+1,right,in,fin,mx);
}
int main()
{ int i,q,a,b;
fin>>n>>m;
for(i=1; i<=n; i++)
{ fin>>v[i];
BuildTree(i,v[i],1,1,n);
}
for(i=1; i<=m; i++)
{ fin>>q>>a>>b;
if(q==0)
{ int mx=0;
Max(1,1,n,a,b,mx);
fout<<mx<<"\n";
}
else ChangeVal(a,b,1,1,n);
}
return 0;
}