#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,node,pre=1,s[N],e[N],p[N],b[N],root[N];
struct segtree{
int l,r,num,sum;
segtree(){
l=r=num=sum=0;
}
}t[N*50];
int clone(int u){
t[++node]=t[u];
return node;
}
void pushup(int u){
t[u].num=t[t[u].l].num+t[t[u].r].num,t[u].sum=t[t[u].l].sum+t[t[u].r].sum;
}
int build(int u,int l,int r){
u=clone(u);
if(l==r){
return u;
}
int mid=(l+r)/2;
t[u].l=build(0,l,mid),t[u].r=build(0,mid+1,r);
return u;
}
int update(int u,int l,int r,int pos,int val,int num){
u=clone(u);
if(l==r){
t[u].num+=num,t[u].sum+=val*num;
return u;
}
int mid=(l+r)/2;
if(pos<=mid){
update(t[u].l,l,mid,pos,val,num);
}
else{
update(t[u].r,mid+1,r,pos,val,num);
}
pushup(u);
return u;
}
int query(int u,int l,int r,int k){
if(l==r){
return t[u].sum/t[u].num*k;
}
int mid=(l+r)/2,tmp=t[t[u].l].num;
if(k<=tmp){
return query(t[u].l,l,mid,k);
}
return t[t[u].l].sum+query(t[u].r,mid+1,r,k-tmp);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i]>>e[i]>>p[i],b[i]=p[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
p[i]=lower_bound(b+1,b+n+1,p[i])-b;
}
root[0]=build(1,1,n);
for(int i=1;i<=n;i++){
int now=1;
while(i<n&&p[i+1]==p[i]){
i++,now++;
}
update(root[i-1],1,n,s[i],b[p[i]],now),root[i]=update(root[i-1],1,n,e[i]+1,-b[p[i]],now);
}
for(int x,a,b,c;m--;){
cin>>x>>a>>b>>c;
int k=(a*pre+b)%c+1;
if(t[root[x]].num<=k){
pre=t[root[x]].sum;
}
else{
pre=query(root[x],1,n,k);
}
cout<<pre<<'\n';
}
}