#include <stdio.h>
#include <string>
#include <string.h>
#define maxn 100033
int N, query_number, query_value, max_value;
int arb[4*maxn];
FILE *fin, *fout;
using namespace std;
void update_tree(int node, int st, int dr, int pos)
{
if (st == dr)
arb[node] = query_value;
else
{
int mij = (st + dr) / 2;
if (pos <= mij)
update_tree(node * 2, st, mij, pos);
if (pos > mij)
update_tree(node * 2 + 1, mij + 1, dr, pos);
arb[node] = (arb[node*2] > arb[node*2+1]) ? (arb[node*2]) : (arb[node*2+1]);
}
}
int query_tree(int node, int st, int dr, int a, int b)
{
if (a <= st && b >= dr)
return arb[node];
else
{
int mij = (st + dr) / 2, v1 = 0, v2 = 0;
if (a <= mij)
v1 = query_tree(node*2, st, mij, a, b);
if (b > mij)
v2 = query_tree(node*2+1, mij+1, dr, a, b);
return v1 > v2 ? v1 : v2;
}
}
int main()
{
int i, val;
fin = fopen("arbint.in", "rt");
fout = fopen("arbint.out", "wt");
fscanf(fin, "%d %d", &N, &query_number);
for (i = 0; i < N; i++)
{
fscanf(fin, "%d", &query_value);
//fprintf(fout, "%d ", val);
update_tree(1, 1, N, i + 1);
/*fprintf(fout, "--------------\n");
for (j = 1; j <= 4*N; j++)
{
fprintf(fout, "%d %d\n", j, arb[j]);
}*/
}
int op, a, b;
for (i = 0; i < query_number; i++)
{
fscanf(fin, "%d %d %d", &op, &a, &b);
//fprintf(fout, "%d %d %d\n", op, a, b);
if (op == 0)
fprintf(fout, "%d\n", query_tree(1, 1, N, a, b));
else
{
query_value = b;
update_tree(1, 1, N, a);
}
}
fclose(fin), fclose(fout);
return 0;
}