#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arbint[500001], vec[100001];
void build(int node, int left, int right)
{
if(left == right)
arbint[node] = vec[left];
else
{
int middle = (left + right) / 2;
build(2 * node, left, middle);
build(2 * node + 1, middle + 1, right);
arbint[node] = max(arbint[2 * node], arbint[2 * node + 1]);
}
}
void update(int node, int value, int pos, int left, int right)
{
if (left == right)
arbint[node] = value;
else
{
int middle = (left + right) / 2;
if (pos <= middle)
update(2 * node, value, pos, left, middle);
else
update(2 * node + 1, value, pos, middle + 1, right);
arbint[node] = max(arbint[2 * node], arbint[2 * node + 1]);
}
}
int query(int node, int left1, int right1, int left2, int right2)
{
if (left1 <= left2 && right2 <= right1)
return arbint[node];
else
{
int middle = (left2 + right2) / 2;
int subarbleft = 0, subarbright = 0;
if (left1 <= middle)
subarbleft = query(2 * node, left1, right1, left2, middle);
if (right1 > middle)
subarbright = query(2 * node + 1, left1, right1, middle + 1, right2);
return max(subarbleft, subarbright);
}
}
int main()
{
int n, m;
fin>>n>>m;
for(int i = 1; i <= n; i++)
fin>>vec[i];
build(1, 1, n);
for (int i = 1; i <= m; i++)
{
int option, a, b;
fin>>option>>a>>b;
if (option == 0)
fout<<query(1, a, b, 1, n)<<"\n";
else if (option == 1)
update(1, b, a, 1, n);
}
return 0;
}