#include <fstream>
#include <algorithm>
const int MAX_N(100001);
int v [MAX_N];
int It [MAX_N * 4];
inline int Left_son (int node)
{
return node * 2;
}
inline int Right_son (int node)
{
return node * 2 + 1;
}
void Build (int index, int left, int right)
{
if (left == right)
{
It[index] = v[left];
return;
}
int mid((left + right) / 2);
Build(Left_son(index),left,mid);
Build(Right_son(index),mid + 1,right);
It[index] = std::max(It[Left_son(index)],It[Right_son(index)]);
}
void Update (int index, int left, int right, int node, int value)
{
if (left == right)
{
It[index] = value;
return;
}
int mid((left + right) / 2);
if (node <= mid)
Update(Left_son(index),left,mid,node,value);
else
Update(Right_son(index),mid + 1,right,node,value);
It[index] = std::max(It[Left_son(index)],It[Right_son(index)]);
}
int Query (int index, int left, int right, int ql, int qr)
{
if (ql <= left && right <= qr)
return It[index];
int mid((left + right) / 2), result(0);
if (ql <= mid)
result = Query(Left_son(index),left,mid,ql,qr);
if (qr > mid)
result = std::max(result,Query(Right_son(index),mid + 1,right,ql,qr));
return result;
}
int main (void)
{
std::ifstream input("arbint.in");
std::ofstream output("arbint.out");
int n, m;
input >> n >> m;
for (int i(1) ; i <= n ; ++i)
input >> v[i];
Build(1,1,n);
int q, x, y;
while (m)
{
input >> q >> x >> y;
if (q)
Update(1,1,n,x,y);
else
output << Query(1,1,n,x,y) << '\n';
--m;
}
input.close();
output.close();
return 0;
}