#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#define in "arbint.in"
#define out "arbint.out"
using namespace std;
ifstream f(in);
ofstream g(out);
int arbore[2*100000+5];
int n, m;
int val;
int maxi;
int op, a, b;
void add(int nod, int st, int dr, int pos, int val)
{
if(st == dr){
arbore[nod] = val;
return;
}
int mij = (st+dr)/2;
if(pos <= mij){
add(2*nod, st, mij, pos, val);
}else{
add(2*nod+1, mij+1, dr, pos, val);
}
arbore[nod] = max(arbore[2*nod], arbore[2*nod+1]);
}
void query(int nod, int st, int dr, int a, int b)
{
if(a <= st and dr <= b){
maxi = max(arbore[nod], maxi);
return;
}
int mij = (st+dr)/2;
if(a <= mij){
query(2*nod, st, mij, a, b);
}
if(b > mij){
query(2*nod+1, mij+1, dr, a, b);
}
}
int main()
{
f >> n >> m;
for(int i=1; i<=n; i++){
f >> val;
add(1, 1, n, i, val);
}
for(int i=0; i<m; i++){
f >> op >> a >> b;
if(op == 0){
maxi = -1;
query(1, 1, n, a, b);
g << maxi << '\n';
}
if(op == 1){
add(1, 1, n, a, b);
}
}
return 0;
}