#include<stdio.h>
#define MAX(x, y) ((x > y) ? x : y)
#define NMAX 100001
int N, M, val, v, p;
int start, finish, index;
int Tree[4 * NMAX + 10];
int maximum;
void UPDATE(int node, int left, int right, int position, int value){
if(left == right){
Tree[node] = value;
return;
}
int middle;
middle = (left + right) / 2;
if(position <= middle)
UPDATE(2 * node, left, middle, position, value);
else
UPDATE(2 * node + 1, middle + 1, right, position, value);
Tree[node] = MAX(Tree[2 * node], Tree[2 * node + 1]);
}
void QUERY(int node, int left, int right, int start, int finish){
if(start <= left && finish >= right){
if(Tree[node] > maximum)
maximum = Tree[node];
return;
}
int middle;
middle = (left + right) / 2;
if(start <= middle)
QUERY(2 * node, left, middle, start, finish);
if(finish > middle)
QUERY(2 * node + 1, middle + 1, right, start, finish);
}
void read_print(FILE *pf, FILE *pg){
int i;
fscanf(pf, "%d %d", &N, &M);
for(i = 1; i <= N; i++){
fscanf(pf, "%d ", &val);
UPDATE(1, 1, N, i, val);
}
for(i = 1; i <= M; i++){
fscanf(pf, "%d %d %d", &index, &p, &v);
switch(index){
case 0: maximum = -1; QUERY(1, 1, N, p, v); fprintf(pg, "%d\n", maximum); break;
case 1: UPDATE(1, 1, N, p, v); break;
}
}
}
int main(){
FILE *pf, *pg;
pf = fopen("arbint.in", "r");
pg = fopen("arbint.out", "w");
read_print(pf, pg);
fclose(pf);
fclose(pg);
return 0;
}