#include <iostream>
#include <vector>
#include <iomanip>
#include <fstream>
using namespace std;
const int N = 1e5 + 5;
int val[N];
int aint[N * 4];
int n, m;
int pos, value;
void update_node(int node)
{
aint[node] = max(aint[node * 2] , aint[node * 2 + 1]);
}
void build_aint(int node = 1, int left = 1, int right = n)
{
if (left == right)
{
aint[node] = val[left];
return;
}
int middle = (left + right) / 2;
build_aint(node * 2, left, middle);
build_aint(node * 2 + 1, middle + 1, right);
update_node(node);
}
void update_aint(int pos, int value, int node = 1, int left = 1, int right = n)
{
if (left == right)
{
aint[node] = value;
return;
}
int middle = (left + right) / 2;
if (middle >= pos)
update_aint(pos, value, node * 2, left, middle);
else
update_aint(pos, value, node * 2 + 1, middle + 1, right);
update_node(node);
}
int query_aint(int qLeft, int qRight, int node = 1, int left = 1, int right = n)
{
if (qLeft <= left && right <= qRight)
{
return aint[node];
}
int middle = (left + right) / 2, ans = 0;
if (middle >= qLeft)
ans = max(ans, query_aint(qLeft, qRight, node * 2, left, middle));
if (middle < qRight)
ans = max(ans, query_aint(qLeft, qRight, node * 2 + 1, middle + 1, right));
return ans;
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> n >> m;
for (int i = 1; i <= n; i++)
{
f >> val[i];
}
build_aint(1,1,n);
while (m--)
{
int type, x, y;
f >> type >> x >> y;
// cout << x << " " << y << '\n';
if (type == 1)
update_aint(x, y);
else
g << query_aint(x, y) << '\n';
}
return 0;
}