#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100001;
int tree[4*NMAX];
int v[NMAX];
int N, Q, op, x, y;
void Update (int nod, int lf, int rg, int pos, int val)
{
if (lf == rg)
{
tree[nod] = val;
return;
}
int mid = lf + (rg - lf)/2;
if (pos <= mid) Update(nod * 2, lf, mid, pos, val);
else Update(nod*2+1, mid + 1, rg, pos, val);
tree[nod] = max(tree[nod*2], tree[nod*2+1]);
}
int Query(int nod, int lf, int rg, int L , int R)
{
if (L <= lf && rg <= R)
{
return tree[nod];
}
int mid = lf + (rg - lf)/2;
int ans1, ans2;
ans1 = ans2 = 0;
if (L <= mid) ans1 = Query(nod*2, lf, mid, L, R);
if (mid < R) ans2 = Query(nod*2+1, mid + 1, rg, L, R);
return max(ans1, ans2);
}
int main()
{
fin >> N >> Q;
for (int i = 1; i <= N; ++i)
{
fin >> v[i];
Update (1, 1, N, i, v[i]);
}
for (int i = 1; i <= Q; ++i)
{
fin >> op >> x >> y;
if (op == 0)
{
fout << Query(1, 1, N, x, y) << '\n';
}
else
{
Update(1, 1, N, x, y);
}
}
return 0;
}