#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 262144, INF = 999999999;
int v[NMAX + 5], n, m, st[NMAX + 5];
void build(int node, int l, int r){
if(l == r){
st[node] = v[l];
}
else{
int m = (l + r) / 2;
build(node * 2, l, m);
build(node * 2 + 1, m + 1, r);
st[node] = max(st[node * 2], st[node * 2 + 1]);
}
}
void Update(int node, int l, int r, int p, int val){
if(l == r){
st[node] = val;
v[p] = val;
return;
}
else{
int m = (l + r) / 2;
int ls = node * 2, rs = node * 2 + 1;
if(p <= m){
Update(ls, l, m, p, val);
}
else{
Update(rs, m + 1, r, p, val);
}
st[node] = max(st[ls], st[rs]);
}
}
int Query(int node, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr){
return st[node];
}
int m = (l + r) / 2;
int ls = node * 2, rs = ls + 1;
int ans = -INF;
if (ql <= m){
ans = max(ans, Query(ls, l, m, ql, qr));
}
if (qr > m){
ans = max(ans, Query(rs, m + 1, r, ql, qr));
}
return ans;
}
int main()
{
int i, op, x, y, ans;
fin>>n>>m;
for(i = 1; i <= n; ++i){
fin>>v[i];
}
build(1, 1, n);
for(i = 1; i <= m; ++i){
fin>>op>>x>>y;
if(op == 1){
Update(1, 1, n, x, y);
}
else{
ans = Query(1, 1, n, x, y);
fout<<ans<<"\n";
}
}
return 0;
}