#include <cstdio>
#define NMAX 100005
using namespace std;
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
int ArbMax[NMAX*5];
void Update(int, int, int);
void Query(int, int, int);
int Maxim2(int, int);
int nr, Q, i, POS, VAL, op, x, a, b, maxim, QL, QR;
int main(){
fscanf(fin, "%d", &nr);
fscanf(fin, "%d", &Q);
for(i=1; i<=nr; i++){
fscanf(fin, "%d", &x);
POS = i; VAL = x;
Update(1, 1, nr);
}
for(i=1; i<=Q; i++){
fscanf(fin, "%d", &op);
fscanf(fin, "%d", &a);
fscanf(fin, "%d", &b);
if(op == 1){
POS = a; VAL = b;
Update(1, 1, nr);
}
else{
maxim = -1;
QL = a; QR = b;
Query(1, 1, nr);
fprintf(fout, "%d\n", maxim);
}
}
fclose(fin);
fclose(fout);
return 0;
}
void Update(int nod, int L, int R){
int mid = (L+R)/2;
if(L == R){
ArbMax[nod] = VAL;
return;
}
if(POS <= mid)
Update(2*nod, L, mid);
else
Update(2*nod+1, mid+1, R);
ArbMax[nod] = Maxim2(ArbMax[2*nod], ArbMax[2*nod+1]);
}
void Query(int nod, int left, int right){
int mid = (left+right)/2;
if(QL<=left && QR >=right){
if(maxim < ArbMax[nod]) maxim = ArbMax[nod];
return;
}
if(QL <= mid) Query(nod*2, left, mid);
if(mid < QR) Query(nod*2+1, mid+1, right);
}
int Maxim2(int a, int b){
if(a>b) return a;
else return b;
}