#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=114514,B=300,MAX=1e5;
int n,q;
int a[N],acx[N];
int aclass[N];
int head;
int lst[N],nxt[N];
int ap[N];
int sap[B+15];
struct node{
int l,r,mod,id;
}q1[N];
int include13_fAKe[N];
bool cmp(node a,node b){
int ax=a.l/B,bx=b.l/B;
if(ax!=bx) return ax<bx;
if(ax%2) return a.r<b.r;
else return a.r>b.r;
}
inline int read(){
int a=0,b=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') b=-1;
c=getchar();
}
while(isdigit(c)){
a=(a<<1)+(a<<3)+(c-'0');
c=getchar();
}
return a*b;
}
inline void write(int x){
if(x<0){
putchar('-'),x=-x;
}
if(x>=10) write(x/10);
putchar(x%10+'0');
}
inline void write1(int x){
write(x),putchar(' ');
}
inline void write2(int x){
write(x),putchar('\n');
}
int pow2[N];
void init(int mod){
pow2[0]=1;
for(int i=1;i<=B;i++){
pow2[i]=pow2[i-1]*2;
}
for(int i=B;i<=MAX;i+=B){
pow2[i]=pow2[i-B]*pow2[B];
}
}
void add(int now){
int sum=a[now];
if(!aclass[sum]){
int lst=ap[sum];
if(lst!=0){
sap[lst]-=sum;
}
sap[lst+1]+=sum;
}
ap[sum]++;
}
void del(int now){
int sum=a[now];
if(!aclass[sum]){
int lst=ap[sum];
sap[lst]-=sum;
if(lst!=1) sap[lst-1]+=sum;
}
ap[sum]--;
}
signed main(){
n=read(),q=read();
for(int i=1;i<=n;i++){
a[i]=read(),acx[a[i]]++;
}
for(int i=1;i<=MAX;i++){
if(acx[i]>=B){
head=i;
aclass[i]=1;
break;
}
}
int lst1=head;
for(int i=head+1;i<=MAX;i++){
if(acx[i]>=B){
lst[i]=lst1;
nxt[lst1]=i;
lst1=i;
aclass[i]=1;
}
}
for(int i=1;i<=q;i++){
q1[i].l=read(),q1[i].r=read(),q1[i].mod=read(),q1[i].id=i;
}
sort(q1+1,q1+q+1,cmp);
int l=1,r=0;
for(int i=1;i<=q;i++){
int include13=0;
int mod=q1[i].mod;
init(mod);
while(l>q1[i].l){
l--,add(l);
}
while(r<q1[i].r){
r++,add(r);
}
while(l<q1[i].l){
del(l),l++;
}
while(r>q1[i].r){
del(r),r--;
}
int sum1=r-l+1;
for(int i=head;i;i=nxt[i]){
int now=i;
int all1=sum1,nall1=sum1-ap[i];
int all=pow2[sum1/B*B]*pow2[sum1%B]%mod;
int nall=pow2[nall1/B*B]*pow2[nall1%B]%mod;
int c=all-nall+mod;
c%=mod;
include13+=now*c;
include13%=mod;
}
for(int i=1;i<=B;i++){
int now=sap[i];
int all1=sum1,nall1=sum1-i;
int all=pow2[sum1/B*B]*pow2[sum1%B];
int nall=pow2[nall1/B*B]*pow2[nall1%B];
int c=(all-nall+mod)%mod;
include13+=now*c;
include13%=mod;
}
include13_fAKe[q1[i].id]=include13;
}
for(int i=1;i<=q;i++){
write2(include13_fAKe[i]);
}
putchar('\n');
return 0;
}