#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
void open(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
}
#define MAXN 100010
const int oo=(int)1e9;
int n,m,type,a,b,arr[MAXN],tree[5*MAXN];
void build(int N,int l,int r){
if (l==r){
tree[N]=arr[l];
return ;
}
int mid=(l+r)>>1;
build((N<<1),l,mid);
build((N<<1)|1,mid+1,r);
tree[N]=max(tree[(N<<1)],tree[(N<<1)|1]);
}
int ask(int N,int l,int r){
if (a<=l && r<=b) return tree[N];
if (b<l || a>r) return -oo;
int mid=(l+r)>>1;
int k1=ask((N<<1),l,mid);
int k2=ask((N<<1)|1,mid+1,r);
return max(k1,k2);
}
int main(){
open();
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
build(1,1,n);
for (int i=0;i<m;i++){
scanf("%d%d%d",&type,&a,&b);
if (type==1){
arr[a]=b;
build(1,1,n);
}
else {
printf("%d\n",ask(1,1,n));
}
}
//system("pause");
return 0;
}