#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m, x, task, y;
class arbint{
int const static MAX = 100005;
int tree[4 * MAX];
public:
void Insert(int node, int left, int right, int pos, int val)
{
if(left == right)
{
tree[node] = val;
return;
}
int middle = left + (right - left) / 2;
if(pos <= middle) Insert(node * 2, left, middle, pos, val);
else Insert(node * 2 + 1, middle + 1, right, pos, val);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
int FindMax(int node, int left, int right, int a, int b)
{
if(a <= left && right <= b) return tree[node];
int val_max = -1;
int middle = left + (right - left) / 2;
if(a <= middle) val_max = max(val_max, FindMax(node * 2, left, middle, a, b));
if(middle < b) val_max = max(val_max, FindMax(node * 2 + 1, middle + 1, right, a, b ));
return val_max;
}
};
arbint A;
void read()
{
in >> n >> m;
for(int i = 1; i <= n; ++i)
{
in >> x;
A.Insert(1, 1, n, i, x);
}
for(int i = 1; i <= m; ++i)
{
in >> task >> x >> y;
if(task == 0) out << A.FindMax(1, 1, n, x, y) << "\n";
else A.Insert(1, 1, n, x, y);
}
}
int main()
{
read();
return 0;
}