#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n, m, len, b[2 * N];
int cnt, root[N];
struct ins {
int k, w;
}a[N * 2];
struct node {
int l, r;
long long sum, tot;
}tree[N * 40];
int get (int x) {
return lower_bound (b + 1, b + 1 + len, x) - b;
}
int cmp (ins x, ins y) {
return x.k < y.k;
}
inline void build (int &p, int l, int r) {
p = ++cnt;
if (l == r) return ;
int mid = l + r >> 1;
build (tree[p].l, l, mid);
build (tree[p].r, mid + 1, r);
}
inline void change (int &p, int l, int r, int k, int s) {
tree[++cnt] = tree[p]; p = cnt; tree[cnt].sum ++; tree[cnt].tot += s;
if (l == r) return ;
int mid = l + r >> 1;
if (k <= mid) change (tree[p].l, l, mid, k, s);
else change (tree[p].r, mid + 1, r, k, s);
}
inline long long ask (int p, int l, int r, int k) {
if (l == r) return tree[p].tot;
int mid = l + r >> 1;
long long total = 0;
if (tree[tree[p].l].sum >= k) total += ask (tree[p].l, l, mid, k);
else {
total += tree[tree[p].l].tot;
total += ask (tree[p].r, mid + 1, r, k - tree[tree[p].l].sum);
}
return total;
}
int main () {
long long pre = 1;
scanf ("%d%d", &m, &n);
for (int s, e, p, i = 1; i <= m; i ++ ) {
scanf ("%d%d%d", &s, &e, &p);
b[i] = p; b[i + m] = -p;
a[i].k = s; a[i].w = p;
a[i + m].k = e; a[i + m].w = -p;
}
sort (b + 1, b + 1 + 2 * m);
len = unique (b + 1, b + 1 + 2 * m) - b - 1;
build (root[0], 1, len);
sort (a + 1, a + 1 + m * 2, cmp);
for (int i = 1; i <= m * 2; i ++ ) {
if (!root[a[i].k]) {
int p = a[i].k;
while (!root[--p]);
root[a[i].k] = root[p];
}
change (root[a[i].k], 1, len, get (a[i].w), a[i].w);
}
for (int i = 1; i <= n; i ++ ) {
int x, a, b, c, k;
scanf ("%d%d%d%d", &x, &a, &b, &c);
k = 1 + (a * pre + b) % c;
pre = ask (root[x], 1, len, k);
printf ("%lld\n", pre);
}
return 0;
}