#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const int MAXN = 200'001;
const ll MOD = 1e9+7;
ll bpow(ll a, ll b) {
ll res = 1;
while (b > 0) {
if (b & 1) {
res = (res * a) % MOD;
}
a = (a * a) % MOD;
b >>= 1;
}
return res;
}
ll inv(ll a) {
return bpow(a, MOD-2);
}
struct Node {
Node *l, *r;
int val = 0;
ll mult = 1;
Node(int x, ll y) : val(x), mult(y) {}
Node(Node *a, Node *b) : l(a), r(b) {
if (a) {
val += a->val;
mult *= a->mult;
mult %= MOD;
}
if (b) {
val += b->val;
mult *= b->mult;
mult %= MOD;
}
}
};
Node *build(int tl, int tr) {
if (tl == tr) {
return new Node(0, 1);
} else {
int tm = (tl + tr) / 2;
return new Node(build(tl, tm), build(tm+1, tr));
}
}
Node *upd(Node *v, int tl, int tr, int pos) {
if (tl == tr) {
return new Node(v->val+1, (v->mult*tl)%MOD);
} else {
int tm = (tl + tr) / 2;
if (pos <= tm) {
return new Node(upd(v->l, tl, tm, pos), v->r);
} else {
return new Node(v->l, upd(v->r, tm+1, tr, pos));
}
}
}
ll qry(Node *v, Node *u, int tl, int tr, int k) {
if (tl == tr) {
return bpow(tl, k);
} else {
int tm = (tl + tr) / 2;
int to_right = v->r->val - u->r->val;
if (k <= to_right) {
return qry(v->r, u->r, tm+1, tr, k);
} else {
return (((v->r->mult*inv(u->r->mult))%MOD)*qry(v->l, u->l, tl, tm, k-to_right))%MOD;
}
}
}
void solve() {
int n, q; cin >> n >> q;
vector<Node *> roots = {build(1, MAXN)};
for (int i = 1; i <= n; i++) {
int x; cin >> x;
roots.emplace_back(upd(roots.back(), 1, MAXN, x));
}
while (q--) {
int l, r, k; cin >> l >> r >> k;
l++; r++;
cout << qry(roots[r], roots[l-1], 1, MAXN, k) << "\n";
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}