#include <cstdio>
#include <cctype>
#define BUFF_SIZE (1<<17)
#define MAXN 1000000
#define max2(a, b) ( a>b ? a : b )
FILE *fin, *fout;
int n, pos=BUFF_SIZE, pos1, poz, rasp, left, right;
signed char buff[BUFF_SIZE], buff1[BUFF_SIZE], ch;
int v[MAXN], arb[MAXN];
inline char next(){
if(pos==BUFF_SIZE){
fread(buff, BUFF_SIZE, 1, fin);
pos=0;
}
return buff[pos++];
}
inline void read(int *x){
*x=0;
ch=next();
while(!isdigit(ch)) ch=next();
while(isdigit(ch)){
*x=(*x)*10+ch-'0';
ch=next();
}
}
inline void baga(){
buff1[pos1++]=ch;
if(pos1==BUFF_SIZE){
fwrite(buff1, BUFF_SIZE, 1, fout);
pos1=0;
}
}
inline void insert(int x){
char s[10];
int k=0;
do{
s[k++]=x%10+'0';
x/=10;
}while(x);
while(k>0){
k--;
ch=s[k];
baga();
}
}
inline void start(int leaf, int left, int right){
if(left==right){
arb[leaf]=v[left];
return;
}
int m=(left+right)/2;
start(2*leaf+1, left, m);
start(2*leaf+2, m+1, right);
arb[leaf]=max2(arb[leaf*2+1], arb[leaf*2+2]);
}
inline void update(){
int leaf=0, left=0, right=n-1, m;
while(left<right){
m=(left+right)/2;
if(poz<=m) right=m, leaf=leaf*2+1;
else left=m+1, leaf=leaf*2+2;
}
///facem o cautare binara ca sa vedem pe ce nod e intervalul (poz, poz)
arb[leaf]=v[left];
leaf=(leaf-1)/2;
while(leaf){
arb[leaf]=max2(arb[leaf*2+1], arb[leaf*2+2]);
leaf=(leaf-1)/2;
}
arb[leaf]=max2(arb[leaf*2+1], arb[leaf*2+2]);
}
inline void query(int leaf, int st, int dr){
if(left<=st && dr<=right){
rasp=max2(rasp, arb[leaf]);///daca (st, dr) e inclus in (left, right)
return;
}
int m=(st+dr)/2;
if(left<=m) query(leaf*2+1, st, m);///investigam fiecare child node
if(right>=m+1) query(leaf*2+2, m+1, dr);
}
int main(){
int m, a, b, x, i;
fin=fopen("arbint.in", "r");
fout=fopen("arbint.out", "w");
read(&n);
read(&m);
for(i=0; i<n; i++)
read(&v[i]);
start(0, 0, n-1);
for(i=0; i<m; i++){
read(&x);
read(&a);
read(&b);
if(x==0){
left=a-1; right=b-1;
rasp=0;
query(0, 0, n-1);
insert(rasp);
ch='\n';
baga();
}
else{
poz=a-1;
v[poz]=b;
update();
}
}
if(pos1>0) fwrite(buff1, pos1, 1, fout);
fclose(fin);
fclose(fout);
return 0;
}