#include <stdio.h>
#include <string>
#include <string.h>
#define maxn 100033
int N, query_number;
int arb[4*maxn];
FILE *fin, *fout;
using namespace std;
void update_tree(int node, int val, int st, int dr, int a, int b)
{
if (st == dr)
arb[node] = val;
else
{
int mij = (st + dr) / 2;
if (a <= mij)
update_tree(node * 2, val, st, mij, a, b);
if (b > mij)
update_tree(node * 2 + 1, val, mij + 1, dr, a, b);
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", &val);
//fprintf(fout, "%d ", val);
update_tree(1, val, 1, N, i+1, 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
update_tree(1, b, 1, N, a, a);
}
fclose(fin), fclose(fout);
return 0;
}