#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
#define cin fin
#define cout fout
#define Nmax 100010
int n, Max;
int intervale[Nmax];
void update(int nod, int left, int right, int poz, int val) {
if(left == right) {
intervale[nod] = val;
return;
}
int mijl = (left + right) / 2;
if(poz <= mijl) {
update(2 * nod, left, mijl, poz, val);
} else {
update(2 * nod +1, mijl + 1, right, poz, val);
}
intervale[nod] = max( intervale[ 2*nod ], intervale[ 2*nod + 1]);
}
void query(int nod, int left, int right, int start, int finish) {
if(start <= left && finish >= right) {
Max = max(Max, intervale[nod]);
return;
}
int mijl = (left + right) / 2;
if(start <= mijl) {
query(2*nod, left, mijl, start, finish);
} else if( finish > mijl){
query(2*nod+1, mijl+1, right, start, finish);
}
}
int main() {
int q;
cin >> n >> q;
for(int i=1; i<=n; i++) {
int x;
cin >> x;
update(1, 1, n, i, x);
}
while(q--) {
int caz, a, b;
cin >> caz >> a >> b;
if(caz == 1) {
update(1, 1, n, a, b);
} else {
Max = -1;
query(1, 1, n, a, b);
cout << Max << endl;
}
}
}