#include <cstdio>
const int N = 32767;
int n, m;
int v[N];
inline int min ( int a, int b ) { return (a < b) ? a : b; }
inline int max ( int a, int b ) { return (a > b) ? a : b; }
void add ( int ci, int cis, int cid, int s, int d, int val ) {
if (v[ci] < val) v[ci] = val;
if (s == d) return;
int m = (cis+cid)/2;
if (s <= m) add(2*ci,cis,m,s,min(m,d),val);
if (d > m) add(2*ci+1,m+1,cid,max(m+1,s),d,val);
}
int query ( int ci, int cis, int cid, int s, int d ) {
if (cis == s && cid == d) return v[ci];
int r = 0;
int m = (cis+cid)/2;
if (s <= m) r = max(r,query(2*ci,cis,m,s,min(m,d)));
if (d > m) r = max(r,query(2*ci+1,m+1,cid,max(m+1,s),d));
return r;
}
int main() {
freopen("arbint.in","rt",stdin);
freopen("arbint.out","wt",stdout);
scanf("%d %d",&n,&m);
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d",&x);
add(1,1,n,i,i,x);
}
for (int i = 0; i < m; ++i) {
int com,a,b;
scanf("%d %d %d",&com,&a,&b);
if (com == 0)
printf("%d\n",query(1,1,n,a,b)); else
add(1,1,n,a,a,b);
}
return 0;
}