#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int v[4*100001];
int x1, y1;
int maximus;
int maxim(int a, int b){
if(a > b )return a;
return b;
}
void update(int nod, int poz, int x, int st, int dr)
{
if(st == dr){
v[nod] = x;
}
else{
int m = (st+dr)/2;
if(poz <= m)update(2*nod, poz, x, st, m);
else update(2*nod+1, poz, x, m+1, dr);
v[nod] = maxim(v[2*nod], v[nod*2+1]);
}
}
void query(int nod, int st, int dr, int a, int b){
if(st >= a && dr <= b){
if(maximus < v[nod])maximus = v[nod];
}
else{
x1 = -1, y1 = -1;
int m = (st+dr)/2;
if(m >= a){
query(nod*2, st, m, a, b);
}
if(m+1 <= b){
query(nod*2+1, m+1, dr, a, b);
}
}
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; i++){
int x;
fin>>x;
update(1, i, x, 1, n);
}
for(int i=1; i<=m; i++){
int x, a, b;
fin>>x>>a>>b;
if(x == 0){
maximus = -1;
query(1, 1, n, a, b);
fout<<maximus<<'\n';
}
else{
update(1, a, b, 1, n);
}
}
}