#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, Q;
int v[100005], a[100005];
void build(int nod, int st, int dr){
if(st == dr){
a[nod] = v[st];
}else{
int m = (st + dr) / 2;
build(2 * nod, st, m);
build(2 * nod + 1, m + 1, dr);
a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}
}
void update(int nod, int st, int dr, int index, int val){
if(st == dr){
a[nod] = val;
}else{
int m = (st + dr) / 2;
if(st <= index && index <= m){
update(2 * nod, st, m, index, val);
}else{
update(2 * nod + 1, m + 1, dr, index, val);
}
a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}
}
int query(int nod, int st, int dr, int c1, int c2){
if(c2 < st || c1 > dr) return 0;
if(st >= c1 && dr <= c2) return a[nod];
int m = (st + dr) / 2;
return max(query(2 * nod, st, m, c1 , c2), query(2 * nod + 1, m + 1, dr, c1, c2));
}
int main()
{
in>>n>>Q;
for(int i = 1; i <= n; i++)
in>>v[i];
int op, x, y;
build(1, 1, n);
for(int i = 1; i <= Q; i++){
in>>op>>x>>y;
if(op == 0){
out<<query(1, 1, n, x, y)<<'\n';
}else{
update(1, 1, n, x, y);
}
}
return 0;
}