rt,WA 40
#include <bits/stdc++.h>
#define ll long long
namespace IO {
const int SIZE = (1 << 20) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE],*oS = obuf, *oT = obuf + SIZE - 1;
char _st[55];
int _qr = 0;
inline char gc() {
return (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS++) : *iS++);
}
inline void qread() {}
template<class T1, class ...T2>
inline void qread(T1 &IEE, T2&... ls) {
register T1 __ = 0, ___ = 1;
register char ch;
while(!isdigit(ch = gc())) ___ = (ch == '-') ? -___ : ___;
do {
__ = (__ << 1) + (__ << 3) + (ch ^ 48);
}while(isdigit(ch = gc()));
__ *= ___;
IEE = __;
qread(ls...);
return ;
}
inline void flush() {
fwrite(obuf, 1, oS - obuf, stdout);
oS = obuf;
return ;
}
inline void putc_(char _x) {
*oS++ = _x;
if(oS == oT) flush();
}
inline void qwrite() {}
template<class T1, class ...T2>
inline void qwrite(T1 IEE, T2... ls) {
if(!IEE) putc_('0');
if(IEE < 0) putc_('-'), IEE = -IEE;
while(IEE) _st[++_qr] = IEE % 10 + '0', IEE /= 10;
while(_qr) putc_(_st[_qr--]);
qwrite(ls...);
return ;
}
struct Flusher_{~Flusher_(){flush();}}io_flusher;
}
using namespace IO;
using namespace std;
const int N = 1e5 + 5;
const int inf = 0x3f3f3f3f;
struct SegTree {
int cnt, lson, rson;
ll sum;
#define t(x) Tree[x]
#define l(x) Tree[x].lson
#define r(x) Tree[x].rson
#define c(x) Tree[x].cnt
#define s(x) Tree[x].sum
} Tree[N << 5];
int n, m, tot;
int a[N], b[N], rt[N << 5];
vector<int> v1[N], v2[N];
void update(int &root, int l, int r, int lst, int x, int v) {
root = ++tot;
t(root) = t(lst);
c(root) += v, s(root) += 1ll * b[x] * v;
if(l == r) return ;
int mid = (l + r) >> 1;
if(mid >= x) update(l(root), l, mid, l(lst), x, v);
else update(r(root), mid + 1, r, r(lst), x, v);
}
ll query(int root, int l, int r, int v) {
int num = c(l(root));
if(l == r) return s(root) / (1ll * c(root)) * v;
int mid = (l + r) >> 1;
if(num >= v) return query(l(root), l, mid, v);
else return query(r(root), mid + 1, r, v - num) + s(l(root));
}
int main() {
qread(m, n);
for(int i = 1; i <= m; i++) {
int x, y;
qread(x, y);
v1[x].push_back(i);
v2[y + 1].push_back(i);
qread(a[i]);
b[i] = a[i];
}
sort(b + 1, b + m + 1);
int kk = unique(b + 1, b + m + 1) - b - 1;
for(int i = 1; i <= n; i++) {
rt[i] = rt[i - 1];
for(auto j : v1[i]) {
int up = lower_bound(b + 1, b + kk + 1, a[j]) - b;
update(rt[i], 1, kk, rt[i], up, 1);
}
for(auto j : v2[i]) {
int up = lower_bound(b + 1, b + kk + 1, a[j]) - b;
update(rt[i], 1, kk, rt[i], up, -1);
}
}
ll ans = 1;
while(n--) {
int x, p, q, k;
qread(x, p, q, k);
int pre = (1ll * p * ans + q) % k + 1;
if(pre > c(rt[x])) ans = s(rt[x]);
else ans = query(rt[x], 1, kk, pre);
printf("%lld\n", ans);
}
return 0;
}