#include <cstdio>
#define NMAX 100005
#define INF 999999999
using namespace std;
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
int max2(int a, int b){
if(a >= b)
return a;
return b;
}
void U(int, int, int);
void Q(int, int, int);
int arbint[5*NMAX];
int n, m, i, pozitie, valoare, maxim, a, b, x, op;
int main(){
fscanf(fin, "%d%d", &n, &m);
for(i=1; i<=n; ++i){
pozitie = i;
fscanf(fin, "%d", &x);
valoare = x;
U(1, 1, n);
}
for(i=1; i<=n; ++i){
fscanf(fin, "%d%d%d", &op, &a, &b);
if(op == 1){
x=b;
pozitie = a;
U(1, 1, n);
}
else{
maxim = -1;
Q(1, 1, n);
fprintf(fout, "%d\n", maxim);
}
}
return 0;
}
void U(int nod, int left, int right){
int mid=(left+right)/2;
if(left == right){
arbint[nod] = x;
}
else{
if(pozitie <= mid)
U(nod*2, left, mid);
else
U(nod*2+1, mid+1, right);
arbint[nod] = max2(arbint[2*nod], arbint[2*nod+1]);
}
}
void Q(int nod, int left, int right){
int mid = (left+right)/2;
if(left >= a && right <= b){
if(arbint[nod] > maxim)
maxim = arbint[nod];
}
else{
if(a <= mid)
Q(nod*2, left, mid);
if(mid < b)
Q(nod*2+1, mid+1, right);
}
}