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