#include <bits/stdc++.h>
#include <vector>
template <typename T, typename Merge>
struct segment_tree {
Merge merge;
T id_val;
segment_tree(Merge merge, T id_val) : merge(merge), id_val(id_val) { }
int n;
std::vector<T> tree;
template <typename Tp>
void __build(int node, int l, int r, const std::vector<Tp> &list) {
if (r - l <= 1) {
tree[node] = list[l];
return;
}
int m = l + r >> 1;
__build(node << 1, l, m, list);
__build(node << 1 | 1, m, r, list);
tree[node] = merge(tree[node << 1], tree[node << 1 | 1]);
}
template <typename Tp>
void build(const std::vector<Tp> &list) {
n = list.size();
tree = std::vector<T>(4 * n);
__build(1, 0, n, list);
}
T query(int node, int l, int r, int ll, int rr) {
if (ll <= l && r <= rr) {
return tree[node];
}
if (r <= ll || rr <= l) {
return id_val;
}
int m = l + r >> 1;
T ans = id_val;
ans = merge(ans, query(node << 1, l, m, ll, rr));
ans = merge(ans, query(node << 1 | 1, m, r, ll, rr));
return ans;
}
};
int main() {
int n, m;
std::cin >> n >> m;
std::vector<int> vec(n);
for (auto &e : vec) std::cin >> e;
auto chmax = [&](int a, int b) {return std::max(a, b);};
auto chmin = [&](int a, int b) {return std::min(a, b);};
segment_tree<int, decltype(chmax)> maxtree(chmax, INT_MIN);
segment_tree<int, decltype(chmin)> mintree(chmin, INT_MAX);
maxtree.build(vec);
mintree.build(vec);
for (int i = 0; i < m; i++) {
int op, l, r;
std::cin >> op >> l >> r;
if (op == 1) {
std::cout << mintree.query(1, 0, n, l - 1, r) << '\n';
} else {
std::cout << maxtree.query(1, 0, n, l - 1, r) << '\n';
}
}
return 0;
}