#include <iostream>
#include <fstream>
using namespace std;
int v[100001], aint[400001];
void build(int nod, int l, int r)
{
int mij;
if(l == r)
{
aint[nod] = v[l];
}
else
{
mij = (l + r) / 2;
build(2 * nod, l, mij);
build(2 * nod + 1, mij + 1, r);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
void update(int nod, int l, int r, int pos, int val)
{
int mij;
if(l == r)
{
aint[nod] = val;
}
else
{
mij = (l + r) / 2;
if(pos <= mij)
{
update(2 * nod, l, mij, pos, val);
}
else
{
update(2 * nod + 1, mij + 1, r, pos, val);
}
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
int query(int nod, int l, int r, int st, int dr)
{
int mij;
if(st > r || dr < l)
{
return 0;
}
if(st <= l && dr >= r)
{
return aint[nod];
}
mij = (l + r) / 2;
return max(query(2 * nod, l, mij, st, dr), query(2 * nod + 1, mij + 1, r, st, dr));
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, m, t, x, y, i;
cin >> n >> m;
for(i = 1; i <= n; i++)
{
cin >> v[i];
}
build(1, 1, n);
for(i = 1; i <= m; i++)
{
cin >> t >> x >> y;
if(t == 0)
{
cout << query(1, 1, n, x, y) << "\n";
}
else
{
update(1, 1, n, x, y);
}
}
return 0;
}