#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int N_MAX = 1e5 + 3;
int N,M,x;
int aint[4 * N_MAX];
void Update(int node, int l, int r, int pos, int val)
{
if (l == r)
{
aint[node] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
Update(2 * node, l, mid, pos, val);
else
Update(2 * node + 1, mid + 1, r, pos, val);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
int Query(int node, int lo, int hi, int l, int r)
{
if (lo == l && hi == r)
return aint[node];
int mid = (lo + hi) / 2;
if (r <= mid)
return Query(2 * node, lo, mid, l, r);
else if (l > mid)
return Query(2 * node + 1, mid + 1, hi, l, r);
else
return max(Query(2 * node, lo, mid, l, mid), Query(2 * node + 1, mid + 1, hi, mid + 1, r));
}
int main()
{
fin>>N>>M;
for(int i = 1; i <= N; i++)
{
fin>>x;
Update(1, 1, N, i, x);
}
for(int i = 1; i <= M; i++)
{
int op,a,b;
fin>>op>>a>>b;
if (op == 0)
fout << Query(1, 1, N, a, b) << "\n";
else
Update(1, 1, N, a, b);
}
return 0;
}