#include <fstream>
#include <vector>
#include <cmath>
//#include <algorithm>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, m, t, x, y, hossz;
struct adat
{
int bal, jobb;
int max;
};
vector<adat>v;
vector<int>szamok;
void Felepit(int i, int bal, int jobb)
{
v[i].bal = bal;
v[i].jobb = jobb;
v[i].max = 0;
if (bal != jobb)
{
Felepit(i * 2, bal, (bal + jobb) / 2);
Felepit(i * 2 + 1, (bal + jobb) / 2 + 1, jobb);
v[i].max = max(v[i * 2].max, v[i * 2 + 1].max);
}
else v[i].max = szamok[bal];
}
void Update(int i, int ind, int val)
{
if (v[i].bal == v[i].jobb && v[i].bal == ind)
{
v[i].max = val;
}
else if (ind <= (v[i].bal + v[i].jobb) / 2)
{
Update(i * 2, ind, val);
v[i].max = max(v[i * 2].max, v[i * 2 + 1].max);
}
else
{
Update(i * 2 + 1, ind, val);
v[i].max = max(v[i * 2].max, v[i * 2 + 1].max);
}
}
long long Query(int i, int l, int r)
{
if (v[i].bal == l && v[i].jobb == r) return v[i].max;
else
{
int fele = (v[i].bal + v[i].jobb) / 2;
if (r <= fele) return Query(i * 2, l, r);
else if (l > fele) return Query(i * 2 + 1, l, r);
else return max(Query(i * 2, l, fele),Query(i * 2 + 1, fele + 1, r));
}
}
int main()
{
cin >> n >> m;
szamok.resize(n + 1, 0);
for (int i = 1; i <= n; ++i)
cin >> szamok[i];
hossz = pow(2, log2(n - 1) + 2);
v.resize(hossz);
Felepit(1, 1, n);
while (m)
{
--m;
cin >> t >> x >> y;
if (t == 1) Update(1, x, y);
else cout << Query(1, x, y) << "\n";
}
return 0;
}