#include <fstream>
#include <algorithm>
#define NMAX 100007
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int Arbint[NMAX * 3];
int Ans;
int n, m;
void update(int Node, int st, int dr, int val, int poz){
if(st == dr){
Arbint[Node] = val;
return;
}
int med = (st + dr) >> 1;
if(med >= poz)
update(Node * 2, st, med, val, poz);
else
update(Node * 2 + 1, med + 1, dr, val, poz);
Arbint[Node] = max(Arbint[Node * 2], Arbint[Node * 2 + 1]);
}
void query(int Node, int st, int dr, int x, int y){
if(st >= x && y >= dr){
Ans = max(Ans, Arbint[Node]);
return ;
}
int med = (st + dr) >> 1;
if(med >= x)
query(Node * 2, st, med, x, y);
if(med < y)
query(Node * 2 + 1, med + 1, dr, x, y);
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; ++i){
int a;
cin >> a;
update(1, 1, n, a, i);
}
for(int i = 1; i <= m; ++i){
int Type, x, y;
cin >> Type >> x >> y;
if(Type == 1)
update(1, 1, n, y, x);
if(Type == 0){
Ans = 0;
query(1, 1, n, x, y);
cout << Ans << "\n";
}
}
return 0;
}