#include <bits/stdc++.h>
#define n_max 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m;
int arb[4 * n_max];
void update(int node, int left, int right, int position, int value)
{
if(left > right || left > position || right < position)
return;
if(left == right)
{
arb[node] = value;
return;
}
int mid = (left + right) >> 1;
update(2 * node, left, mid, position, value);
update(2 * node + 1, mid + 1, right, position, value);
arb[node] = max(arb[2 * node], arb[2 * node + 1]);
}
int query(int node, int left, int right, int a, int b)
{
if(left > right || left > b || a > right)
return 0;
if(a <= left && right <= b)
return arb[node];
int mid = (left + right) >> 1;
return max(query(2 * node, left, mid, a, b), query(2 * node + 1, mid + 1, right, a, b));
}
void read()
{
f>>n>>m;
int x;
for(int i = 1;i <= n;++i)
f>>x, update(1, 1, n, i, x);
}
void solve()
{
int x, y, z;
for(int i = 1;i <= m;++i)
{
f>>x>>y>>z;
if(!x)
g<<query(1, 1, n, y, z)<<'\n';
else
update(1, 1, n, y, z);
}
}
int main()
{
read();
solve();
return 0;
}