#include <bits/stdc++.h>
using namespace std;
#define pb push_back
class SegmentTree
{
int _n;
vector <int> t;
public:
SegmentTree(int n)
{
_n = n;
t.resize(4 * n + 5);
}
void init(vector <int> &a, int v, int l, int r)
{
if(l == r)
{
t[v] = a[l];
// cout << l << " " << r << " " << t[v] << "\n";
return;
}
int mid = (l + r) / 2;
init(a, 2 * v, l, mid);
init(a, 2 * v + 1, mid + 1, r);
t[v] = max(t[2 * v], t[2 * v + 1]);
// cout << l << " " << r << " " << t[v] << "\n";
}
void update(int v, int l, int r, int poz, int x)
{
if(l == r)
{
t[v] = x;
return;
}
int mid = (l + r) / 2;
if(poz <= mid)
update(2 * v, l, mid, poz, x);
else
update(2 * v + 1, mid + 1, r, poz, x);
t[v] = max(t[2 * v], t[2 * v + 1]);
}
int query(int v, int l, int r, int tl, int tr)
{
if(tl > tr)
return 0;
if(tl == l && tr == r)
return t[v];
int mid = (l + r) / 2;
return max(query(2 * v, l, mid, tl, min(tr, mid)),
query(2 * v + 1, mid + 1, r, max(mid + 1, tl), tr));
}
};
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
cin >> n >> m;
SegmentTree aint(n);
vector <int> a;
a.resize(n + 1);
for(int i = 1; i <= n; i ++)
cin >> a[i];
// for(int x : a)
// cout << x << " ";
// cout << "\n";
aint.init(a, 1, 1, n);
for(int i = 1; i <= m; i ++)
{
int op, a, b;
cin >> op >> a >> b;
if(op == 0)
{
cout << aint.query(1, 1, n, a, b) << "\n";
}
else
{
aint.update(1, 1, n, a, b);
}
}
return 0;
}