#include <fstream>
#include <iostream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
const int NMAX = 1e5;
int ain[4*NMAX+4];
void update(int nod, int st, int dr, int val, int poz){
if(st == dr){
ain[nod] = val;
return;
}
int mij = (st + dr)/2;
if(poz <= mij)
update(2*nod, st, mij, val, poz);
else update(2*nod+1, mij+1, dr, val, poz);
ain[nod] = max(ain[2*nod], ain[2*nod+1]);
}
void query(int nod, int st, int dr, int &mx, int p, int u){
if(st >= p and dr <= u){
mx = max(mx, ain[nod]);
return;
}
int mij = (st + dr)/2;
if(p <= mij)
query(2*nod, st, mij, mx, p, u);
if(u > mij)
query(2*nod+1, mij+1, dr, mx, p, u);
}
int main()
{
int n, q;
f >> n >> q;
for(int i=1; i<=n; i++){
int k;
f >> k;
update(1, 1, n, k, i);
}
for(int i=1; i<=q; i++){
int t;
f>>t;
if(t == 1){
int poz, val;
f>>poz>>val;
update(1, 1, n, val, poz);
}else{
int bg, end;
f >> bg >> end;
int maxim = -1;
query(1, 1, n, maxim, bg, end);
g << maxim << "\n";
}
}
return 0;
}