#include <fstream>
#define dim 100001
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
int tree[4 * dim + 13];
int maxi, N, M;
void Update(int nod, int currL, int currR, int pos, int val) {
if ( currL == currR ) {
tree[nod] = val;
return;
}
int mid = currL + (currR - currL) / 2;
if ( pos <= mid ) Update(2 * nod, currL, mid, pos, val);
else Update(2 * nod + 1, mid + 1, currR, pos, val);
tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}
void Query(int nod, int currL, int currR, int queL, int queR) {
if ( queL <= currL && currR <= queR ) {
if ( maxi < tree[nod] ) maxi = tree[nod];
return;
}
int mid = currL + (currR - currL) / 2;
if ( queL <= mid ) Query(2 * nod, currL , mid, queL, queR);
if ( mid < queR ) Query(2 * nod + 1, mid + 1, currR, queL, queR);
}
int main() {
int x, a, b;
f >> N >> M;
for (int i = 1; i <= N; i++) {
f >> x;
Update(1, 1, N, i, x);
}
for ( int i = 1; i <= M; i++ ) {
f >> x >> a >> b;
if ( x == 0 ) {
maxi = -1;
Query(1, 1, N, a, b);
g << maxi << '\n';
}
else Update(1, 1, N, a, b);
}
}