#include<stdio.h>
#include<algorithm>
#define NMAX 100007
using namespace std;
int Arbi[NMAX * 2], n, m, Ans;
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 + 1, med + 1, dr, val, poz);
else
update(2 * Nod, st, med, val, poz);
Arbi[Nod] = max(Arbi[Nod * 2], Arbi[Nod * 2 + 1]);
}
void query(int Nod, int st, int dr, int a, int b){
if(st >= a && dr >= b){
Ans = max(Ans, Arbi[Nod]);
return ;
}
int med = (st + dr) >> 1;
if(med < b)
query(Nod * 2 + 1, med + 1, dr, a, b);
if(med > a)
query(Nod * 2, st, med, a, b);
}
int main(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++ i){
int a = 0;
scanf("%d", &a);
update(1, 1, n, a, i);
}
for(int i = 1; i <= m; ++ i){
int Tip = 0, a = 0, b = 0;
scanf("%d %d %d", &Tip, &a, &b);
if(Tip == 0){
Ans = 0;
query(1, 1, n, a, b);
printf("%d\n", Ans);
}
else
update(1, 1, n, b, a);
}
}