#include <fstream>
#define max(a, b) a > b ? a : b
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void read();
void update(int node, int position, long long int value, int left, int right);
long long int query(int node, int low, int high, int left, int right);
long long int tree[400005];
int n, m;
int main()
{
read();
return 0;
}
void read()
{
int i, t, a, b;
long long int x;
fin >> n >> m;
for (i = 1; i <= n; i++)
{
fin >> x;
update(1, i, x, 1, n);
}
for (i = 1; i <= m; i++)
{
fin >> t >> a >> b;
if (t == 0)
fout << query(1, a, b, 1, n) << '\n';
else
update(1, a, b, 1, n);
}
}
void update(int node, int position, long long int value, int left, int right)
{
if (left == right)
tree[node] = value;
else
{
int mid = left + (right - left) / 2;
if (position <= mid)
update(2 * node, position, value, left, mid);
else
update(2 * node + 1, position, value, mid + 1, right);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
}
long long int query(int node, int low, int high, int left, int right)
{
if (low <= left && right <= high)
return tree[node];
else
{
int mid = left + (right - left) / 2, jos = -1, sus = -1;
if (low <= mid)
jos = query(2 * node, low, high, left, mid);
if (mid < high)
sus = query(2 * node + 1, low, high, mid + 1, right);
return max(jos, sus);
}
}