#include <stdio.h>
using namespace std;
const int MAX = (1 << 17) + 1;
int tree[2 * MAX + 10];
int n, m, sol = 0;
int max(int x, int y)
{
if(x > y)
return x;
return y;
}
void update(int node, int left, int right, int pos, int val)
{
if(left == right)
{
tree[node] = val;
return;
}
int mid = (left + right) / 2;
if(pos <= mid)
update(2 * node, left, mid, pos, val);
else
update(2 * node + 1, mid + 1, right, pos, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void querry(int node, int left, int right, int a, int b)
{
if(a <= left && right <= b)
{
sol = max(sol, tree[node]);
return;
}
int mid = (left + right) / 2;
if(a <= mid)
querry(2 * node, left, mid, a, b);
if(b > mid)
querry(2 * node + 1, mid + 1, right, a, b);
}
int main()
{
FILE *fin, *fout;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
fscanf(fin, "%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
int x;
fscanf(fin, "%d", &x);
update(1, 1, n, i, x);
}
for(int i = 1; i <= m; i++)
{
int op, x, y;
fscanf(fin, "%d%d%d", &op, &x, &y);
if(op == 0)
{
sol = 0;
querry(1, 1, n, x, y);
fprintf(fout, "%d\n", sol);
}
else
{
update(1, 1, n, x, y);
}
}
return 0;
}