#include <cstdio>
#define IN_FILE_NAME "arbint.in"
#define OUT_FILE_NAME "arbint.out"
#define NMAX 3000000
#define INF -1000000000
FILE *in, *out;
int N,M;
int arbMax[NMAX];
int max(int a, int b) {
return a > b ? a : b;
}
void update(int nod, int left, int right, int pos, int val) {
if (right == left) {
arbMax[nod] = val;
} else if (right < left){
return ;
} else {
int mid;
mid = (left + right) >> 1;
if (pos <= mid) {
update(2*nod, left, mid, pos, val);
} else {
update(2*nod+1, mid+1, right, pos, val);
}
arbMax[nod] = max(arbMax[2*nod], arbMax[2*nod+1]);
}
}
int query(int nod, int start, int end, int left, int right) {
int mid;
if (start <= left && end >= right) {
return arbMax[nod];
}else if (end < left || start > right) {
return INF;
} else {
mid = (left + right) >> 1;
return max(
query(2*nod, start, end, left, mid),
query(2*nod+1, start, end, mid+1, right)
);
}
}
void read() {
int val;
fscanf(in, "%d %d", &N, &M);
for (int i = 1 ; i <= N ; i++) {
fscanf(in, "%d ", &val);
update(1, 1, N, i, val);
}
}
void solve() {
int op, a,b;
for(int i = 0 ; i < M ; i++) {
fscanf(in, "%d %d %d", &op, &a, &b);
if (op == 0) {
fprintf(out, "%d\n", query(1, a, b, 1, N));
} else {
update(1, 1, N, a, b);
}
}
}
int main() {
in = fopen(IN_FILE_NAME, "r");
out = fopen(OUT_FILE_NAME, "w");
read();
solve();
fclose(in);
fclose(out);
return 0;
}