#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int NMAX = 1e5;
int n, a[NMAX + 1];
int Q;
int aint[4 * NMAX + 1];
void Build(int node, int left, int right)
{
if(left == right)
aint[node] = a[left];
else
{
int mid = (left + right) / 2;
Build(node * 2, left, mid);
Build(node * 2 + 1, mid + 1, right);
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
}
void Update(int node, int left, int right, int pos, int value)
{
if(left == right)
aint[node] = value;
else
{
int mid = (left + right) / 2;
if(pos <= mid)
Update(node * 2, left, mid, pos, value);
else
Update(node * 2 + 1, mid + 1, right, pos, value);
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
}
int Query(int node, int left, int right, int Qleft, int Qright)
{
if(left >= Qleft && right <= Qright)
return aint[node];
int mid = (left + right) / 2;
if(mid > Qright)
Query(node * 2, left, mid, Qleft, Qright);
else if(mid + 1 < Qleft)
Query(node * 2 + 1, mid + 1, right, Qleft, Qright);
int max1 = Query(node * 2, left, mid, Qleft, Qright);
int max2 = Query(node * 2 + 1, mid + 1, right, Qleft, Qright);
return max(max1, max2);
}
int main()
{
cin >> n >> Q;
for(int i = 1; i <= n; i++)
cin >> a[i];
Build(1, 1, n);
while(Q--)
{
int tip, x, y;
cin >> tip >> x >> y;
if(tip == 0)
Update(1, 1, n, x, y);
else
cout << Query(1, 1, n, x, y) << '\n';
}
return 0;
}