#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
const int mod=1e9+7;
const int maxn=1e5+10;
const int maxm=1e7+10;
const ll INF=1e18;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){if(y==0) return x;return gcd(y,x%y);}
int n,m,xx,p;
int root[maxn],num[maxn*40],ch[maxn*40][2],tot=0;///
ll sum[maxn*40],pre;
vector<int> g[maxn];///
/*主席树这道题我槽点比较多。。。。
首先是刚开始时候的离散化来减少时间,
再到后面是查询的手法。如果没有初始化的话那主席树的边界情况要十分小心。
*/
void update(int old,int &cur,int l,int r,int pos,int v1,int v2){
cur=++tot;
ch[cur][0]=ch[old][0],ch[cur][1]=ch[old][1];
sum[cur]=sum[old]+v1,num[cur]=num[old]+v2;
if(l==r) return ;
int mid=l+r>>1;
if(pos<=mid) update(ch[old][0],ch[cur][0],l,mid,pos,v1,v2);
else update(ch[old][1],ch[cur][1],mid+1,r,pos,v1,v2);
}
int val[maxn],pos[maxm],idx=0;///离散化用
ll query(int cur,int l,int r,int k){
if(l==r) return 1LL*val[l-1]*k;
int mid=l+r>>1;
if(num[ch[cur][0]]>=k) return query(ch[cur][0],l,mid,k);
else return sum[ch[cur][0]]+query(ch[cur][1],mid+1,r,k-num[ch[cur][0]]);
}
int main(){
/*
freopen("d://in.txt","r",stdin);
freopen("d://out.txt","w",stdout);*/
while(~scanf("%d%d%d%d",&n,&m,&xx,&p)){
tot=0,pre=1;
rep(i,1,xx+1) g[i].clear();
rep(i,1,n+1){
int l,r,d;
scanf("%d%d%d",&l,&r,&d);
g[l].push_back(d);
g[r+1].push_back(-d);
val[i-1]=d;
}///离散化
sort(val,val+n);
idx=unique(val,val+n)-val;
rep(i,0,idx) pos[val[i]]=i+1;
rep(i,1,xx+1){
root[i]=root[i-1];
for(auto v:g[i]){
int x1=v,x2=(v>0?1:-1);
update(root[i],root[i],1,idx,pos[x1*x2],x1,x2);
}
}
///printf("%d\n",sum[root[1]]);
rep(i,0,m){
int x,a,b,c;
scanf("%d%d%d%d",&x,&a,&b,&c);
int k=(1LL*a*pre+b)%c;
ll ans=query(root[x],1,idx,k);
if(pre>p) ans<<=1;
pre=ans;
printf("%lld\n",ans);
}
}
return 0;
}