#include <fstream>
using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
int arbint[4 * 100005];
void mcdonalds (int l, int r, int poz, int x, int node){
if (l == r){
arbint[node] = x;
return;
}
int mid = (l + r) / 2;
if (poz <= mid){
mcdonalds(l, mid, poz, x, node * 2);
}
else{
mcdonalds(mid + 1, r, poz, x, node * 2 + 1);
}
arbint[node] = max (arbint[node * 2], arbint[node * 2 + 1]);
}
int pepene (int l, int r, int a, int b, int node){
if (a <= left and right <= b){
return arbint[node];
}
int mid = (l + r) / 2;
int soll = 0, solr = 0;
if (a <= mid){
soll = pepene(l, mid, a, b, node * 2);
}
if (mid + 1 <= b){
solr = pepene (mid + 1, r, a, b, node * 2 + 1);
}
return max (soll, solr);
}
int main()
{
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; ++i){
int x;
cin >> x;
mcdonalds(1, n, i, x, 1);
}
for (int i = 1; i <= q; ++i){
int a, b, c;
cin >> c >> a >> b;
if (c == 1){
mcdonalds(1, n, a, b, 1);
}
else{
cout << pepene(1, n, a, b, 1);
}
}
return 0;
}