#include <cstdio>
#define maxim(a,b) (a>b)?a:b
using namespace std;
long long arb[500005];
long long n,m,a,b;
void introduce(int val,int ord,int i,int j,long long nod) {
if (i==j) {
arb[nod] = val;
return;
}
int mij = i + (j-i)/2;
if (ord <= mij) introduce(val,ord,i,mij,2*nod);
else introduce(val,ord,mij+1,j,2*nod+1);
arb[nod] = maxim(arb[2*nod],arb[2*nod+1]);
}
int maxinterval(int a,int b,int i,int j,int nod) {
if (i==a && j==b) return arb[nod];
int mij = i + (j-i)/2;
if (b <= mij) {
return maxinterval(a,b,i,mij,nod*2);
} else if (a > mij) {
return maxinterval(a,b,mij+1,j,nod*2+1);
} else {
return maxim(maxinterval(a,mij,i,mij,nod*2),maxinterval(mij+1,b,mij+1,j,2*nod+1));
}
}
int main() {
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=n;i++) {
int crt;
scanf("%d",&crt);
introduce(crt,i,1,n,1);
}
for (int i=1;i<=m;i++) {
int tip,a,b;
scanf("%d %d %d",&tip,&a,&b);
if (tip == 0) printf("%d\n",maxinterval(a,b,1,n,1));
else introduce(b,a,1,n,1);
}
}