# include <cstdio>
using namespace std;
int H[300010], n, m, v[100003];
inline int maxim (int a, int b){
if (a < b) return a;
return b;
}
inline void update2 (int st, int dr, int i, int val, int node){
if (st >= dr){
H[node] = val;
return ;
}
int m = (st + dr) >> 1;
if (i <= m)
update2 (st, m, i, val, (node << 1));
else
update2 (m + 1, dr, i, val, (node << 1) + 1);
H[node] = maxim (H[node << 1], H[(node << 1) + 1]);
}
inline int query (int i, int j, int node, int st, int dr){
if (i <= st && dr <= j) return H[node];
int m = (st + dr) >> 1;
int sol = 0;
if (i <= m)
sol = maxim (sol, query (i, j, node << 1, st, m));
if (j > m)
sol = maxim (sol, query (i, j, (node << 1) + 1, m + 1, dr));
return sol;
}
int i, Q, st, dr;
int main (){
freopen ("rmq.in", "r", stdin);
freopen ("rmq.out", "w", stdout);
scanf ("%d%d", &n, &m);
for (i = 1; i <= n; ++i){
scanf ("%d", &v[i]);
update2 (1, n, i, v[i], 1);
}
for (; m > 0; --m){
scanf ("%d%d%d", &Q, &st, &dr);
printf ("%d\n", query (st, dr, 1, 1, n));
}
return 0;
}