#include <bits/stdc++.h>
using namespace std;
const int NMAX = 400050;
int v[NMAX],poz,val,lef,rig,mx;
void update(int nod,int l,int r){
if(l == r){
v[nod] = val;
return ;
}
int mij = (l + r)/2;
if(poz <= mij)
update(2*nod,l,mij);
else
update(2*nod+1,mij+1,r);
v[nod] = max(v[2*nod],v[2*nod + 1]);
}
void query(int nod,int l,int r){
if(lef <= l && rig >= r ){
if(mx < v[nod]) mx = v[nod];
return ;
}
int mij = (l + r)/2;
if(lef <= mij)
query(2*nod,l,mij);
if(mij < rig)
query(2*nod,mij+1,r);
}
int main()
{
freopen("arbint.in", "r" ,stdin);
freopen("arbint.out", "w" ,stdout);
int n,m,q,x,y;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &val);
poz = i;
update(1,1,n);
}
for(int i = 1; i <= m; i++){
scanf("%d %d %d" , &q , &x , &y);
if(q == 1){
poz = x;
val = y;
update(1,1,n);
}
else{
mx = -1;
lef = x;
rig = y;
query(1,1,n);
printf("%d\n" , mx);
}
}
return 0;
}