#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 100000+10
#define Nd Node*
#define pii pair<int,int>
#define mp make_pair
#define ft first
#define sc second
#define pb push_back
#define ll long long
using namespace std;
struct Node{
Nd l;Nd r;
int L,R,cnt;
ll sum;
};
Nd rt[MAXN];
ll b[MAXN];
Nd NewNode(Nd l,Nd r,int L,int R,ll sum,int cnt){
Nd ret=new Node;
ret->l=l,ret->r=r,ret->L=L,ret->R=R,ret->sum=sum,ret->cnt=cnt;
return ret;
}
Nd Build(int L,int R){
Nd ret=NewNode(NULL,NULL,L,R,0LL,0);
if(L+1!=R)ret->l=Build(L,(L+R)>>1),ret->r=Build((L+R)>>1,R);
return ret;
}
void update(Nd &A,Nd B,int p,ll x,int f){
if(!B)return;
A=NewNode(B->l,B->r,B->L,B->R,B->sum+f*x,B->cnt+f);
if(p<(B->L+B->R)>>1)update(A->l,B->l,p,x,f);
else update(A->r,B->r,p,x,f);
}
ll query(Nd A,int k){
if(!A->l)return k*b[A->L];
if(A->l->cnt>=k)return query(A->l,k);
else return query(A->r,k-A->l->cnt)+A->l->sum;
}
struct Opt{
int L,R,p;
ll x;
}s[MAXN];
int n,m,sz;
vector<pii> vs[MAXN];
void init(){
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
scanf("%d%d%lld",&s[i].L,&s[i].R,&s[i].x);
b[i]=s[i].x;
}
sort(b+1,b+m+1);
sz=unique(b+1,b+m+1)-(b+1);
rt[0]=Build(1,sz+1);
for(int i=1;i<=m;i++){
s[i].p=lower_bound(b+1,b+m+1,s[i].x)-b;
vs[s[i].L].pb(mp(s[i].p,1));
vs[s[i].R+1].pb(mp(s[i].p,-1));
}
for(int i=1;i<=n;i++){
rt[i]=rt[i-1];
for(int j=0;j<vs[i].size();j++){
pii &t=vs[i][j];
update(rt[i],rt[i],t.ft,b[t.ft],t.sc);
}
}
}
void solve(){
ll pre=1,X,A,B,C;
int k;
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld%lld",&X,&A,&B,&C);
k=(A*pre+B)%C+1;
pre=(k>=rt[X]->cnt?rt[X]->sum:query(rt[X],k));
printf("%lld\n",pre);
}
}
int main()
{
//freopen("data.in","r",stdin);
init();
solve();
return 0;
}