#include <cstdio>
#include <algorithm>
using namespace std;
FILE *fin = fopen("arbint.in","r");
FILE *fout = fopen("arbint.out","w");
int N, M, X, A, B;
int MyArb[450000];
int in, sf, val, pos, mx;
void Update(int nod, int st, int dr);
void Query(int nod, int st, int dr);
int main() {
fscanf(fin, "%d %d\n", &N, &M);
for (int i = 1; i <= N; ++i) {
fscanf(fin, "%d", &X);
pos = i, val = X;
Update(1,1,N);
}
for ( int i = 1; i <= M; i++ )
{
fscanf(fin, "%d%d%d", &X, &A, &B);
if ( X == 0 )
{
mx = -1;
in = A, sf = B;
Query(1,1,N);
fprintf(fout,"%d\n", mx);
}
else
{
pos = A, val = B;
Update(1,1,N);
}
}
}
void Update(int nod, int st, int dr) {
if(st == dr) {
MyArb[nod] = val;
return;
}
int mij = (st + dr) / 2;
if(pos <= mij) Update(2 * nod, st, mij);
else Update(2 * nod + 1, mij + 1, dr);
MyArb[nod] = max(MyArb[2 * nod], MyArb[2 * nod + 1] );
}
void Query(int nod, int st, int dr) {
if(in <= st && dr <= sf) {
if(mx < MyArb[nod]) mx = MyArb[nod];
return;
}
int mij = (st + dr) / 2;
if(in <= mij) Query(2 * nod, st, mij);
if(mij < sf) Query(2 * nod + 1, mij + 1, dr);
}