#include <iostream>
#include <fstream>
#define N 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[4*N];
void update(int node, int left, int right, int poz, int val)
{
if(left == right)
{aint[node] = val; return;}
int mijl = (left + right) / 2;
if(poz <= mijl)
update(2 * node, left, mijl, poz, val);
else update(2 * node + 1, mijl + 1, right, poz, val);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
int query(int node, int left, int right, int a, int b)
{
if(a <= left && right <= b)
return aint[node];
int val1, val2;
int mijl = (left + right) / 2;
if(a <= mijl)
val1 = query(2 * node, left, mijl, a, b);
if(b > mijl)
val2 = query(2 * node + 1, mijl + 1, right, a, b);
return max(val1, val2);
}
int main()
{
int n, m;
int x, i, task, a, b;
fin >> n >> m;
for(i = 1; i <= n; i++)
{
fin >> x;
update(1, 1, n, i, x);
}
for(i = 1; i <= m; i++)
{
fin >> task >> a >> b;
if(task == 0) fout << query(1, 1, n, a, b) << "\n";
else if(task == 1) update(1, 1, n, a, b);
}
}