#include<stdio.h>
#define NMAX 1000007
int Ans, n, m, a, b, Arbi[NMAX];
int max(int a, int b){
if(a > b)
return a;
return b;
}
void update(int nod, int st, int dr, int VAL, int POZ){
if(st == dr){
Arbi[nod] = VAL;
return ;
}
int med = (st + dr) >> 1;
if(med >= POZ)
update(2 * nod, st, med, VAL, POZ);
else
update(2 * nod + 1, med + 1, dr, VAL, POZ);
Arbi[nod] = max(Arbi[nod * 2], Arbi[nod * 2 + 1]);
}
void query(int nod, int st, int dr, int x, int y)
{
if(st >= x && dr <= y){
Ans = max(Ans, Arbi[nod]);
return ;
}
int med = (st + dr) >> 1;
if(med >= x)
query(2 * nod, st, med, x, y);
if(med < y)
query(2 * nod + 1, med + 1, dr, x, y);
}
int main(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++ i){
scanf("%d", &a);
update(1, 1, n, a, i);
}
for(int i = 1; i <= m; ++ i){
int Tip = 0;
scanf("%d %d %d", &Tip, &a, &b);
if(Tip == 1)
update(1, 1, n, b, a);
else{
Ans = 0;
query(1, 1, n, a, b);
printf("%d\n" , Ans);
}
}
}