#include<cstdio>
using namespace std;
int i, a[200005], n, m, op, x, y, mx;
int max(int a, int b){if (a>=b) return a; else return b;}
int min(int a, int b){if (a>=b) return b; else return a;}
void update(int poz_real){
a[poz_real]=max(a[poz_real*2], a[poz_real*2+1]);
if (poz_real>1) update(poz_real/2);
}
void change(int st, int dr, int poz, int poz_real, int val) {
int mij=st+(dr-st)/2;
if (st==dr) {a[poz_real]=val; update(poz_real/2);} else {
if (poz<=mij) change(st, mij, poz, poz_real*2, val);
else change(mij+1, dr, poz, poz_real*2+1, val);
}
}
void cauta(int st, int dr, int poz_real){
int mij=st+(dr-st)/2;
if ((x<=st)&&(dr<=y)) {if (a[poz_real]>mx) mx=a[poz_real]; return;}
if (x<=mij) cauta(st, mij, poz_real*2);
if (mij<y) cauta(mij+1, dr, poz_real*2+1);
}
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); change(1, n, i, 1, x);}
for (i=1;i<=m;i++) {
scanf("%d%d%d", &op, &x, &y);
if (op==0) {mx=-1; cauta(1, n, 1); printf("%d\n", mx);}
else change(1, n, x, 1, y);
}
return 0;
}