#include <stdio.h>
#define MAXN 100000
#define LOGN 17
#define MAXP (1<<(LOGN+1))
int t[MAXP+1];
int a, b, poz, val;
inline int maxim(int a, int b){
if(a>=b){
return a;
}
return b;
}
int query(int p, int st, int dr){
int m=(st+dr)/2, m1=0, m2=0;
if((a<=st)&&(dr<=b)){
return t[p];
}
if(a<=m){
m1=query(2*p, st, m);
}
if(b>m){
m2=query(2*p+1, m+1, dr);
}
return maxim(m1, m2);
}
void update(int p, int st, int dr){
int m=(st+dr)/2;
if(st==dr){
t[p]=val;
return ;
}
if(poz<=m){
update(2*p, st, m);
}
if(poz>m){
update(2*p+1, m+1, dr);
}
t[p]=maxim(t[2*p], t[2*p+1]);
}
int main(){
int n, q, i, f;
FILE *fin, *fout;
fin=fopen("arbint.in", "r");
fout=fopen("arbint.out", "w");
fscanf(fin, "%d%d", &n, &q);
for(i=1; i<=n; i++){
fscanf(fin, "%d", &val);
poz=i;
update(1, 1, n);
}
for(i=1; i<=n; i++){
fscanf(fin, "%d%d%d", &f, &a, &b);
if(f==0){
fprintf(fout, "%d\n", query(1, 1, n));
}else{
poz=a;
val=b;
update(1, 1, n);
}
}
fclose(fin);
fclose(fout);
return 0;
}