#pragma GCC optimize(2)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int m, n;
struct Task{
int p;
int v;
};
vector<Task> _taskList[10000010];
struct Node{
int left;
int right;
int count;
long long sum;
} _xds[30000010];
int _cc;
int _banben[100010];
inline int NewNode() {
return ++_cc;
}
inline int Copy(int x) {
_xds[++_cc] = _xds[x];
return _cc;
}
void Push(int& x, int l, int r, int p, int v) {
_xds[x].count+=v;
_xds[x].sum+=p*v;
if (l!=r) {
int mid = l+r>>1;
if (p<=mid) {
_xds[x].left = Copy(_xds[x].left);
Push(_xds[x].left, l, mid, p, v);
return;
}
_xds[x].right = Copy(_xds[x].right);
Push(_xds[x].right, mid+1, r, p, v);
}
}
long long Query(int x, int l, int r, long long k) {
if (l==r || k >= _xds[x].count) return _xds[x].sum;
int mid = l+r>>1;
int countl = _xds[_xds[x].left].count;
if (k<=countl) return Query(_xds[x].left, l, mid, k);
return _xds[_xds[x].left].sum+Query(_xds[x].right, mid+1, r, k-countl);
}
inline long long Solve(int x, int k) {
return Query(_banben[x], 1, 10000000, k);
}
int main() {
int s, e, p;
int x, a, b, c;
Task solo;
long long k;
long long pre = 1ll;
freopen("P3168.in", "r", stdin);
freopen("P3168.out", "w", stdout);
scanf("%d%d", &m, &n);
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &s, &e, &p);
solo.p = p;
solo.v = 1;
_taskList[s].push_back(solo);
if (e < n) {
solo.v = -1;
_taskList[e+1].push_back(solo);
}
}
for (int i = 1; i <= n; i++) {
_banben[i] = Copy(_banben[i-1]);
for (int j = 0; j < _taskList[i].size(); j++) {
Push(_banben[i], 1, 10000000, _taskList[i][j].p, _taskList[i][j].v);
}
}
for (int i = 0; i < n; i++) {
scanf("%d%d%d%d", &x, &a, &b, &c);
k = 1+(a*pre+b)%c;
pre = Solve(x, k);
printf("%lld\n", pre);
}
fclose(stdin);
fclose(stdout);
return 0;
}