#include <stdio.h>
FILE *fin, *fout;
const int MAX = 1 << 18;
int M, N;
int v[MAX], arb[MAX * 2 + 2], ans1;
inline int maxi(int a, int b) {
if(a > b)
return a;
return b;
}
void update(int rad, int poz, int val, int st, int dr) {
if(st > dr)
return;
if(st == dr) {
arb[rad] = val;
return;
}
if(st <= poz && (st + dr) / 2 >= poz)
update(rad * 2, poz, val, st, (st + dr) / 2);
else if((st + dr) / 2 + 1 <= poz && dr >= poz)
update(rad * 2 + 1, poz, val, (st + dr) / 2 + 1, dr);
arb[rad] = maxi(arb[rad * 2], arb[rad * 2 + 1]);
}
void query(int rad, int a, int b, int st, int dr) {
if(st > dr)
return;
if(a <= st && b >= dr) {
ans1 = maxi(arb[rad], ans1);
if(st == dr)
return;
}
else {
if(st == dr)
return;
query(rad * 2, a, b, st, (st + dr) / 2);
query(rad * 2 + 1, a, b, (st + dr) / 2 + 1, dr);
}
}
int main() {
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
fscanf(fin, "%d%d", &N, &M);
for(int i = 1;i <= N;i++) {
fscanf(fin, "%d", &v[i]);
update(1, i, v[i], 1, N);
}
for(int i = 1;i <= M;i++) {
int op, a, b;
printf("%d ", arb[1]);
ans1 = 0;
printf("%d\n", arb[1]);
printf
fscanf(fin, "%d%d%d", &op, &a, &b);
if(op == 0)
query(1, a, b, 1, N), fprintf(fout, "%d\n", ans1);
else
update(1, a, b, 1, N);
}
fclose(fin);
fclose(fout);
return 0;
}