#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int maxN = 100005;
int Arb[4 * maxN], v[maxN], n, op, x, y, q;
void build(int node, int x, int y)
{
if ( x == y )
{
Arb[node] = v[x];
return;
}
int fiu = 2 * node, mid = (x + y) / 2;
build(fiu, x, mid);
build(fiu + 1, mid + 1, y);
Arb[node] = max(Arb[fiu], Arb[fiu + 1]);
}
void update(int node, int x, int y, int pos, int val)
{
if ( x > pos || y < pos )
return;
if ( x == y )
{
Arb[node] = val;
return;
}
int fiu = 2 * node, mid = (x + y) / 2;
update(fiu, x, mid, pos, val);
update(fiu + 1, mid + 1, y, pos, val);
Arb[node] = max(Arb[fiu], Arb[fiu + 1]);
}
int query(int node, int x, int y, int st, int dr)
{
if ( x > dr || y < st )
return -2e9;
if ( st <= x && y <= dr )
return Arb[node];
int fiu = 2 * node, mid = (x + y) / 2;
return max(query(fiu, x, mid, st, dr),
query(fiu + 1, mid + 1, y, st, dr));
}
int main()
{
fin >> n >> q;
for ( int i = 1; i <= n; i++ )
fin >> v[i];
build(1, 1, n);
// cout << query(1, 1, 2, 2, 2);
// return 0;
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);
}
}