#include <fstream>
#define int long long
using namespace std;
int st[400005];
void update(int node, int from, int to, int poz, int val){
if(from == to){
st[node] = val;
return;
}
int mid = (from + to) / 2;
if(poz <= mid){
update(2 * node, from, mid, poz, val);
}else{
update(2 * node + 1, mid + 1, to, poz, val);
}
st[node] = max(st[node * 2], st[node * 2 + 1]);
}
int query(int node, int from, int to, int ql, int qr){
int smin = 0;
if(ql <= from && to <= qr){
return st[node];
}
int mid = (from + to) / 2;
if(ql <= mid){
int s = query(node * 2, from, mid, ql, qr);
smin = max(smin, s);
}
if(mid + 1 <= qr){
int s = query(node * 2 + 1, mid + 1, to, ql, qr);
smin = max(smin, s);
}
return smin;
}
signed main()
{
ifstream cin("aint.in");
ofstream cout("aint.out");
int n, m, ok, x, y, a;
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a;
update(1, 1, n, i, a);
}
for(int i = 0; i < m; i++){
cin >> ok >> x >> y;
if(ok == 1){
update(1, 1, n, x, y);
}else{
cout << query(1, 1, n, x, y) << "\n";
}
}
return 0;
}