#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100010];
int t[400010];
void gen(int pos, int l, int r)
{
if (l == r)
{
t[pos] = v[l];
return;
}
int mid = (l + r) / 2;
gen(pos * 2, l, mid);
gen(pos * 2 + 1, mid + 1, r);
t[pos] = max(t[pos * 2], t[pos * 2 + 1]);
}
int query(int pos, int l, int r, int ql, int qr)
{
if (ql > qr) return -1;
if (l == ql && r == qr)
return t[pos];
int mid = (l + r) / 2;
return max(query(pos * 2, l, mid, ql, min(qr, mid)), query(pos * 2 + 1, mid + 1, r, max(ql, mid + 1), qr));
}
void update(int pos, int l, int r, int up, int uv)
{
if (l == r)
{
t[pos] = uv;
return;
}
int mid = (l + r) / 2;
if (up <= mid)
{
update(pos * 2, l, mid, up, uv);
}
else
{
update(pos * 2 + 1, mid + 1, r, up, uv);
}
t[pos] = max(t[pos * 2], t[pos * 2 + 1]);
return;
}
int main()
{
int N, M;
fin >> N >> M;
for (int i = 1; i <= N; i++)
{
fin >> v[i];
}
gen(1, 1, N);
int x, y;
bool o;
for (int i = 1; i <= M; i++)
{
fin >> o >> x >> y;
if (!o)
{
fout << query(1, 1, N, x, y) << endl;
}
else
{
update(1, 1, N, x, y);
}
}
return 0;
}