#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100000;
int val,pos,left,right;
int n;
class Adi{
public:
int v[2*N+1];
void update(int p,int vv){
pos=p;
val=vv;
my_update(1,1,n);
}
int query(int l,int r){
left=l;
right=r;
return my_query(1,1,n);
}
private:
int my_query(int p,int l,int r){
int m=(l+r)/2;
if(left<=l&&r<=right)
return v[p];
if(r<left||right<l)
return -1;
return max(my_query(p*2,l,m),my_query(p*2+1,m+1,r));
}
void my_update(int p,int l,int r){
int m=(l+r)/2;
if(l==r){
v[p]=val;
return;
}
if(pos<=m)
my_update(p*2,l,m);
else
my_update(p*2+1,m+1,r);
my_merge(p);
}
void my_merge(int p){
v[p]=max(v[p*2],v[p*2+1]);
}
};
Adi t;
int main(){
int q;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
t.update(i,x);
}
while(q){
q--;
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x==0)
printf("%d\n",t.query(y,z));
else
t.update(y,z);
}
return 0;
}