#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 5;
int t, a[NMAX + 1], segt[4 * NMAX + 1], n, x, y, op;
inline void generSegt(const int ST = 1, const int DR = n, const int SEGTI = 1) {
if(ST == DR) {
segt[SEGTI] = a[ST];
return;
}
const int MIJ = (ST + DR) / 2;
generSegt(ST, MIJ, 2 * SEGTI);
generSegt(MIJ + 1, DR, 2 * SEGTI + 1);
segt[SEGTI] = max(segt[2 * SEGTI], segt[2 * SEGTI + 1]);
}
inline void updSegt(const int ST, const int DR, const int POZ, const int VAL, const int SEGTI = 1) {
if(ST == DR) {
segt[SEGTI] = VAL;
return;
}
const int MIJ = (ST + DR) / 2;
if(POZ <= MIJ) updSegt(ST, MIJ, POZ, VAL, 2 * SEGTI);
else updSegt(MIJ + 1, DR, POZ, VAL, 2 * SEGTI + 1);
segt[SEGTI] = max(segt[2 * SEGTI], segt[2 * SEGTI + 1]);
}
inline int querySegt(const int QST, const int QDR, const int ST, const int DR, const int SEGTI = 1) {
if(ST > DR) return 0;
if(ST == QST && DR == QDR) return segt[SEGTI];
const int QMIJ = (QST + QDR)/ 2;
return max(querySegt(QST, QMIJ, ST, min(DR, QMIJ), 2 * SEGTI),
querySegt(QMIJ + 1, QDR, max(ST, QMIJ + 1), DR, 2 * SEGTI + 1));
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &t);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
generSegt();
while(t--) {
scanf("%d%d%d", &op, &x, &y);
if(!op) printf("%d\n", querySegt(1, n, x, y));
else updSegt(1, n, x, y);
}
return 0;
}