RT
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define debug puts("IAKIOI")
#define inf (int)1e18
using namespace std;
struct Segtment_Tree{
int ls,rs,val,sum;
}t[8000010];//200M
int tot;
int root[100010];
int p[100010];
vector<int>beg[100010],ed[100010];
int b[100010],lsh[100010];
#define mid (lf+rt)/2
int build(int lf,int rt)
{
int node=++tot;
if(lf==rt)
{
return tot;
}
t[node].ls=build(lf,mid);
t[node].rs=build(mid+1,rt);
return node;
}
void pu(int x)
{
t[x].val=t[t[x].ls].val+t[t[x].rs].val;
t[x].sum=t[t[x].ls].sum+t[t[x].rs].sum;
}
int upd(int x,int lf,int rt,int p,int v)
{
int node=++tot;
if(lf==rt)
{
t[node].val=t[x].val+v;
t[node].sum=t[x].sum+v*b[p];
return node;
}
if(p<=mid)
{
t[node].ls=upd(t[x].ls,lf,mid,p,v);
t[node].rs=t[x].rs;
}else{
t[node].ls=t[x].ls;
t[node].rs=upd(t[x].rs,mid+1,rt,p,v);
}
pu(node);
return node;
}
int calc(int x,int lf,int rt,int k)
{
if(!k)
{
return 0;
}
if(lf==rt)
{
// return t[x].val;
return k*b[lf] ;
}
if(k<=t[t[x].ls].val)
{
return calc(t[x].ls,lf,mid,k);
}else{
return calc(t[x].rs,mid+1,rt,k-t[t[x].ls].val)+t[t[x].ls].sum;
}
}
signed main()
{
int n,q;
cin >> n >> q;
for ( int i = 1 ; i <= n ; i++ )
{
int l,r;
cin >> l >> r >> p[i];
b[i]=p[i];
beg[l].push_back(i);
ed[r+1].push_back(i);
}
sort(b+1,b+1+n);
int m=unique(b+1,b+1+n)-b-1;
for ( int i = 1 ; i <= n ; i++ )
{
lsh[i]=lower_bound(b+1,b+1+m,p[i])-b;
}
root[0]=build(1,m);
for ( int i = 1 ; i <= q ; i++ )
{
root[i]=root[i-1];
for ( int j = 0 ; j < beg[i].size() ; j++ )
{
root[i]=upd(root[i],1,m,lsh[beg[i][j]],1);
}
for ( int j = 0 ; j < ed[i].size() ; i++ )
{
root[i]=upd(root[i],1,m,lsh[ed[i][j]],-1);
}
}
int lstans=1;
while(q--)
{
int x,a,b,c,k;
cin >> x >> a >> b >> c ;
k=(a*lstans+b)%c+1;
// cout << a << " " << a*lstans << " " << a*lstans+b << " " << (a*lstans+b)%c << endl;
// cout << k << endl;
if(k>=t[root[x]].val)
{
cout << t[root[x]].sum << endl;
continue;
}
lstans=calc(root[x],1,m,k);
cout << lstans << endl;
}
return 0;
}