#include <cstdio>
#define DIM 100010
using namespace std;
int A[4*DIM];
int S[4*DIM];
int n, m, i, a, b, x, t;
inline int maxim(int a, int b) {
return ( a>b ? a : b );
}
int query(int nod, int st, int dr, int a, int b) {
if (a<=st && dr <= b) {
return maxim(A[nod] , S[nod]);
}
int m = (st + dr)/2, mst = 0, mdr = 0;
if (S[nod] != 0) {
A[nod] = S[nod];
S[2*nod] = S[nod];
S[2*nod+1] = S[nod];
S[nod] = 0;
}
if (a <= m)
mst = query(2*nod, st, m, a, b);
if (b >= m+1)
mdr = query(2*nod+1, m+1, dr, a, b);
return maxim(mst, mdr);
}
void update(int nod, int st, int dr, int a, int b, int x) {
if (a <= st && dr <= b) {
S[nod] = x;
return;
}
int m = (st + dr)/2;
if (S[nod] != 0) {
A[nod] = S[nod];
S[2*nod] = S[nod];
S[2*nod+1] = S[nod];
S[nod] = 0;
}
if (a <= m)
update(2*nod, st, m, a, b, x);
if (b >= m+1)
update(2*nod+1, m+1, dr, a, b, x);
A[nod] = maxim(S[2*nod] == 0 ? A[2*nod] : maxim(A[2*nod] , S[2*nod]),S[2*nod+1] == 0 ? A[2*nod+1] : maxim(A[2*nod+1] , S[2*nod+1]));
}
int main() {
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
fscanf(fin, "%d %d", &n, &m);
for (i=1;i<=n;i++) {
fscanf(fin, "%d", &x);
update(1, 1, n, i, i, x);
}
for (i=1;i<=m;i++) {
fscanf(fin, "%d %d %d", &t, &a, &b);
if (t == 1) {
update(1, 1, n, a, a, b);
} else {
fprintf(fout,"%d\n",query(1, 1, n, a, b));
}
}
return 0;
}