#include <bits/stdc++.h>
using namespace std;
ifstream in;
ofstream out;
vector <int> tree;
int n,minim,m;
void build(int vert, int lf, int rg)
{
if (lf == rg)
{
in >> tree[vert];
}
else
{
int mid = (lf + rg) / 2;
build(vert * 2, lf, mid);
build(vert * 2 + 1, mid + 1, rg);
tree[vert] = max(tree[vert * 2], tree[vert * 2 + 1]);
}
}
void query(int vert, int lf, int rg, int a, int b)
{
if (a <= lf and rg <= b)
{
minim = max(minim, tree[vert]);
}
else
{
int mid = (lf + rg) / 2;
if (a <= mid)
query(2 * vert, lf, mid, a, b);
if (b > mid)
query(2 * vert + 1, mid + 1, rg, a, b);
}
}
void update(int vert, int lf, int rg, int a, int b)
{
if (lf == rg)
{
tree[vert] = b;
}
else
{
int mid = (lf + rg) / 2;
if (a <= mid)
update(2 * vert, lf, mid, a, b);
if (a > mid)
update(2 * vert + 1, mid + 1, rg, a, b);
tree[vert] = max(tree[vert * 2], tree[vert * 2 + 1]);
}
}
int main()
{
in.open("arbint.in");
out.open("arbint.out");
in >> n >> m;
tree.resize(4 * n + 100);
build(1, 1, n);
int p, a, b;
for (int i = 0; i < m; i++)
{
in >> p >> a >> b;
//out << p << a << b << endl;
if (p == 0)
{
minim = 0;
query(1, 1, n, a, b);
out << minim <<'\n';
}
else
update(1, 1, n, a, b);
}
out.close();
return 0;
}