#include <cstdio>
#include <cmath>
#define maximum(a, b) a > b ? a : b
using namespace std;
const int MAXN = 1 << 18;
int N, M, K;
int MaxValues[MAXN];
inline void insert(int pos, int val) {
int p = (1 << K) + pos;
MaxValues[p] = val;
while( p > 1 ) {
p >>= 1;
MaxValues[p] = maximum(MaxValues[2 * p], MaxValues[2 * p + 1]);
}
}
inline int getMax(int L, int R, int left, int right, int pos) {
if (L == left && R == right)
return MaxValues[pos];
int m = (L + R) >> 1;
if ( right <= m )
return getMax(L, m, left, right, 2 * pos);
if ( left > m )
return getMax(m + 1, R, left, right, 2 * pos + 1);
int lM, rM, result;
lM = getMax(L, m, left, m, 2 * pos);
rM = getMax(m + 1, R, m + 1, right, 2 * pos + 1);
result = maximum(lM, rM);
return result;
}
inline void read() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%i %i", &N, &M);
K = (int) (log(N) / log(2));
if (1 << K < N)
K++;
int x;
for( int i = 0; i < N; i++) {
scanf("%i", &x);
insert(i, x);
}
}
void solve() {
int type, a, b;
for(int i = 0; i < M; i++) {
scanf("%i%i%i", &type, &a, &b);
switch(type){
case(0): printf("%i\n", getMax(1, 1 << K, a, b, 1)); break;
case(1): insert(a - 1, b); break;
}
}
}
int main() {
read();
solve();
return 0;
}