#include <iostream>
using namespace std;
FILE *f, *g;
int arb[100000 * 2 + 2];
int Poz, X, N, M, a, b, MaxInt;
int Max(int A, int B) {
if(A > B)
return A;
return B;
}
void InsertArb(int left, int right, int k) {/// k = pozitia in vectorul arb
int middle = (left + right) / 2;
if(left == right) {
arb[k] = X;
return;
}
if(Poz <= middle)
InsertArb(left, middle, 2 * k);
else
InsertArb(middle + 1, right, 2*k + 1);
arb[k] = Max(arb[2*k], arb[2*k + 1]);
}
void ReadValues() {
fscanf(f,"%d %d", &N, &M);
for(int i = 1; i <= N; ++i) {
fscanf(f, "%d", &X);
Poz = i;
InsertArb(1, N, 1);
}
}
void DetMax(int left, int right, int k) {
int middle = (left + right) / 2;
if(a <= left && right <= b) {
MaxInt = Max(arb[k], MaxInt);
return;
}
if(a <= middle)
DetMax(left, middle, 2 * k);
if(middle < b)
DetMax(middle + 1, right, 2 * k + 1);
}
void Do_Operation() {
int op;
while(M) {
fscanf(f, "%d %d %d", &op, &a, &b);
--M;
if(op) {
Poz = a, X = b;
InsertArb(1, N, 1);
continue;
}
MaxInt = 0;
DetMax(1, N, 1);
fprintf(g, "%d\n", MaxInt);
}
}
int main() {
f = fopen("arbint.in", "r");
g = fopen("arbint.out", "w");
ReadValues();
Do_Operation();
return 0;
}