#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int cer, a, b;
int v[100005], n, m;
int arb[500000];
int GL, GR; // Grand Left, Right
int poz, val;
int maxim, i;
void query(int nod, int L, int R){
if (GL <= L && R <= GR){
maxim = max(maxim, arb[nod]);
return;
}
int m = (L+R)/2;
if (GL <= m)
query(2*nod, L, m);
if (m < GR)
query(2*nod+1, m+1, R);
}
void update(int nod, int L, int R){
if (L == R){
arb[nod] = val;
return;
}
int m;
m = (L+R)/2;
if (poz <= m)
update(2*nod, L, m);
else update(2*nod+1, m+1, R);
arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}
int main(){
f >> n >> m;
for (i = 1; i <= n; i++){
f >> v[i];
poz = i, val = v[i];
update(1, 1, n);
}
for (;m;m--){
f >> cer >> a >> b;
if (cer == 1){
poz = a, val = b;
update(1, 1, n);
}
else{
maxim = -1;
GL = a, GR = b;
query(1, 1, n);
g << maxim << '\n';
}
}
return 0;
}