#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)
using vi = vector<int>;
const int mxN = (int)3e4+10;
const int MOD = (int)1e9+7;
const int B = 175;
int n, q, dp[110];
int a[mxN], l[mxN], r[mxN], x[mxN], ans[mxN];
void add(int x){
x = a[x];
for(int i = x; i <= 100; i++)
dp[i]+=dp[i-x], dp[i]%=MOD;
}
void rem(int x){
x = a[x];
for(int i = 100; i >= x; i--)
dp[i]+=MOD-dp[i-x], dp[i]%=MOD;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n >> q; dp[0] = 1;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= q; i++)
cin >> l[i] >> r[i] >> x[i];
vi v(q,0); iota(all(v),1);
sort(all(v),[&](int i, int j){
if(l[i]/B==l[j]/B) return (l[i]/B)%2?r[i]>r[j]:r[i]<r[j];
return l[i]<l[j];
});
int L = 1, R = 0;
for(auto i : v){
while(R<r[i]) add(++R);
while(L>l[i]) add(--L);
while(L<l[i]) rem(L++);
while(R>r[i]) rem(R--);
ans[i] = dp[x[i]];
}
for(int i = 1; i <= q; i++) cout << ans[i] << "\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIHN6KGEpIChpbnQpYS5zaXplKCkKI2RlZmluZSBhbGwoYSkgYmVnaW4oYSksZW5kKGEpCgp1c2luZyB2aSA9IHZlY3RvcjxpbnQ+OwoKY29uc3QgaW50IG14TiA9IChpbnQpM2U0KzEwOwpjb25zdCBpbnQgTU9EID0gKGludCkxZTkrNzsKY29uc3QgaW50IEIgPSAxNzU7CgppbnQgbiwgcSwgZHBbMTEwXTsKaW50IGFbbXhOXSwgbFtteE5dLCByW214Tl0sIHhbbXhOXSwgYW5zW214Tl07Cgp2b2lkIGFkZChpbnQgeCl7Cgl4ID0gYVt4XTsKCWZvcihpbnQgaSA9IHg7IGkgPD0gMTAwOyBpKyspCgkJZHBbaV0rPWRwW2kteF0sIGRwW2ldJT1NT0Q7Cn0KCnZvaWQgcmVtKGludCB4KXsKCXggPSBhW3hdOwoJZm9yKGludCBpID0gMTAwOyBpID49IHg7IGktLSkKCQlkcFtpXSs9TU9ELWRwW2kteF0sIGRwW2ldJT1NT0Q7Cn0KCmludCBtYWluKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZSgwKTsKICAgIGNpbiA+PiBuID4+IHE7IGRwWzBdID0gMTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gYVtpXTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKSAKCQljaW4gPj4gbFtpXSA+PiByW2ldID4+IHhbaV07CiAgICB2aSB2KHEsMCk7IGlvdGEoYWxsKHYpLDEpOwogICAgc29ydChhbGwodiksWyZdKGludCBpLCBpbnQgail7CgkJaWYobFtpXS9CPT1sW2pdL0IpIHJldHVybiAobFtpXS9CKSUyP3JbaV0+cltqXTpyW2ldPHJbal07CgkJcmV0dXJuIGxbaV08bFtqXTsKCX0pOwoJaW50IEwgPSAxLCBSID0gMDsKCWZvcihhdXRvIGkgOiB2KXsKCQl3aGlsZShSPHJbaV0pIGFkZCgrK1IpOwoJCXdoaWxlKEw+bFtpXSkgYWRkKC0tTCk7CgkJd2hpbGUoTDxsW2ldKSByZW0oTCsrKTsKCQl3aGlsZShSPnJbaV0pIHJlbShSLS0pOwoJCWFuc1tpXSA9IGRwW3hbaV1dOwoJfQoJZm9yKGludCBpID0gMTsgaSA8PSBxOyBpKyspIGNvdXQgPDwgYW5zW2ldIDw8ICJcbiI7Cn0K