#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX = 100000 + 5;
int N, M;
int Arb[4 * NMAX];
int Add(int node, int left, int right, int val, int pos){
if(left == right){
Arb[node] = val;
return val;
}
int mid = (left + right) / 2;
if(pos <= mid)
Arb[node] = max(Arb[node * 2 + 1], Add(node * 2, left, mid, val, pos));
else
Arb[node] = max(Arb[node * 2], Add(node * 2 + 1, mid + 1, right, val, pos));
return Arb[node];
}
int Query(int node, int left, int right, int a, int b){
if(a <= left && right <= b)
return Arb[node];
int mid = (left + right) / 2;
int newMax = 0;
if(a <= mid)
newMax = max(newMax, Query(node * 2, left, mid, a, b));
if(b > mid)
newMax = max(newMax, Query(node * 2 + 1, mid + 1, right, a, b));
return newMax;
}
int main(){
in >> N >> M;
for(int i = 1; i <= N; ++i){
int nr;
in >> nr;
Add(1, 1, N, nr, i);
}
for(int i = 1; i <= M; ++i){
int o, a, b;
in >> o >> a >> b;
if(o == 0)
out << Query(1, 1, N, a, b) << "\n";
else
Add(1, 1, N, b, a);
}
}