#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX = 100005;
int aint[4 * NMAX];
void update(int val, int pos, int node,int left, int right) {
if(left == right)
aint[node] = val;
else {
int mid = (left + right) / 2;
if(pos <= mid)
update(val, pos, node * 2, left, mid);
else
update(val, pos, node * 2 + 1, mid + 1, right);
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
}
int query(int from, int to, int node, int left, int right) {
if(from <= left && right <= to)
return aint[node];
else {
int mid = (left + right) / 2, maxim = 0;
if(from <= mid)
maxim = query(from, to, node * 2, left, mid);
if(mid < to)
maxim = max(maxim, query(from, to, node * 2 + 1, mid + 1, right));
return maxim;
}
}
int main()
{
ios::sync_with_stdio(false);
in.tie(0);
out.tie(0);
int n, m;
in >> n >> m;
for(int i = 1; i <= n; i ++) {
int x;
in >> x;
update(x, i, 1, 1, n);
}
for(int i = 1; i <= m; i ++) {
int test, a, b;
in >> test >> a >> b;
if(test == 0)
out << query(a, b, 1, 1, n) << "\n";
else
update(b, a, 1, 1, n);
}
return 0;
}