#include <iostream>
#include <fstream>
#include <climits>
#define NMAX 100005
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, queries;
int arr[NMAX], aint[NMAX*2];
void create (int idx, int a, int b){
if (a == b){
aint[idx] = arr[a];
return;
}
int mid = (a+b)/2;
create(idx*2, a, mid);
create(idx*2+1, mid+1, b);
aint[idx] = max(aint[idx*2], aint[idx*2+1]);
}
int query (int idx, int a, int b, int valA, int valB){
if (b < valA || a > valB)
return INT_MIN;
if (a >= valA && b <= valB)
return aint[idx];
int mid = (a+b)/2;
return max(query(idx*2, a, mid, valA, valB), query(idx*2+1, mid+1, b, valA, valB));
}
void update (int idx, int a, int b, int val, int valIdx){
if (a == b){
aint[idx] = val;
return;
}
int mid = (a+b)/2;
if (valIdx <= mid)
update(idx*2, a, mid, val, valIdx);
else
update(idx*2+1, mid+1, b, val, valIdx);
aint[idx] = max(aint[idx*2], aint[idx*2+1]);
}
int main (){
int op, a, b;
in >> n >> queries;
for (int i=1; i<=n; ++i)
in >> arr[i];
create(1, 1, n);
while (queries--){
in >> op >> a >> b;
if (op == 0)
out << query(1, 1, n, a, b) << '\n';
else
update(1, 1, n, b, a);
}
return 0;
}