#include<cstdio>
using namespace std;
int a[200005], i, n, m, x, y, sol, q;
inline int max(int a, int b){if (a>=b) return a; else return b;}
inline void update(int poz){
while (poz>1) {
poz/=2;
a[poz]=max(a[2*poz], a[2*poz+1]);
}
}
inline void place(int poz, int val){
int st=1, dr=n, poz_real=1, mij;
while (st<dr) {
mij=st+(dr-st)/2;
if (poz<=mij) {dr=mij; poz_real=poz_real*2;}
else {st=mij+1; poz_real=poz_real*2+1;}
}
a[poz_real]=val;
update(poz_real);
}
int get_max(int st, int dr, int poz_real){
int mij=st+(dr-st)/2, v1, v2;
///maximul in intervalul [x,y]
if ((x<=st)&&(dr<=y)) return a[poz_real];
if (x<=mij) v1=get_max(st, mij, poz_real*2); else v1=-1;
if (mij<y) v2=get_max(mij+1, dr, poz_real*2+1); else v2=-1;
return max(v1,v2);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d", &n, &m);
for (i=1;i<=n;i++) {scanf("%d", &x); place(i, x);}
for (i=1;i<=m;i++) {
scanf("%d%d%d", &q, &x, &y);
if (q==1) place (x, y);
if (q==0) {sol=get_max(1,n,1); printf("%d\n", sol);}
}
return 0;
}