#include <fstream>
#include <vector>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
#define MAX_N 100000
#define pb push_back
int n, m, aint[4 * MAX_N + 1];
vector <int> a;
void build(int v, int l, int r)
{
if(l == r)
{
aint[v] = a[l];
return ;
}
int m = (l + r) / 2;
build(2 * v, l, m);
build(2 * v + 1, m + 1, r);
aint[v] = max(aint[2 * v], aint[2 * v + 1]);
}
int query(int v, int tl, int tr, int l, int r)
{
if(l > r)
return 0;
if(l == tl && r == tr)
return aint[v];
int m = (tl + tr) / 2;
return max(query(2 * v, tl, m, l, min(m, r)),
query(2 * v + 1, m + 1, tr, max(m + 1, l), r));
}
void update(int v, int l, int r, int pos, int x)
{
if(l == r)
{
aint[v] = x;
return;
}
int m = (l + r) / 2;
if(pos <= m)
update(2 * v, l, m, pos, x);
else
update(2 * v + 1, m + 1, r, pos, x);
aint[v] = max(aint[2 * v], aint[2 * v + 1]);
}
int main()
{
in >> n >> m;
for(int i = 0; i < n; i ++)
{
int x;
in >> x;
a.pb(x);
}
build(1, 0, n - 1);
for(int i = 0; i < m; i ++)
{
int c, a, b;
in >> c >> a >> b;
a--;
b--;
if(c == 0)
out << query(1, 0, n - 1, a, b) << "\n";
else
update(1, 0, n - 1, a, b);
}
return 0;
}