#include<bits/stdc++.h>
#define double long double
#define inf 0x3f3f3f3f
#define int long long
using namespace std;
struct zyx{
double x;
int num;
};
struct csq{
double l,r;
int s;
};
vector<csq> ans[3010];
int D,n,K,q,flag[3010],w[3010];
double k[3010],b[3010];
vector<zyx> point;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
bool cmp(zyx a,zyx b){
return a.x<b.x||(a.x==b.x&&a.num>b.num);
}
signed main(){
D=read(),K=read(),n=read(),q=read();
for(int i=1;i<=n;i++){
int a=read(),tb=read();
w[i]=read();
k[i]=(tb-a)*1.0/D,b[i]=a;
}
for(int i=1;i<=n;i++){
point.clear();
for(int j=1;j<=n;j++){
if(i==j||abs(k[i]-k[j])<=1e-15)continue;
double temp=(b[j]-b[i])/(k[i]-k[j]);
if(temp>1e-15&&temp-D<1e-15)point.push_back((zyx){temp*1.0,j});
}
point.push_back((zyx){0.0,3005}),point.push_back((zyx){D*1.0,3005});
memset(flag,-1,sizeof flag);
bool f=0;
int sum=0;
for(int j=1;j<=n;j++){
if(i==j)continue;
if(abs(b[j]-b[i])<=1e-15&&f==0){
point.push_back((zyx){0.0,j});
f=1;
if(k[j]-k[i]>1e-15)flag[j]=0;
else flag[j]=-1;
}
else if(b[j]-b[i]>1e-15)flag[j]=1,sum+=w[j];
else flag[j]=0;
}
sort(point.begin(),point.end(),cmp);
for(int j=0;j<point.size()-1;j++){
ans[i].push_back((csq){point[j].x,point[j+1].x,sum});
if(point[j+1].num==3005)continue;
if(flag[point[j+1].num]==1)sum-=w[point[j+1].num];
else if(flag[point[j+1].num]!=-1)sum+=w[point[j+1].num];
}
}
int lstans=0;
while(q--){
int p=read(),l=read();
int r=l+K;
lstans=0;
bool tf=0;
for(int i=0;i<ans[p].size();i++){
if(ans[p][i].l-r>=1e-15)break;
if(ans[p][i].r-l>1e-15)tf=1,lstans=max(lstans,ans[p][i].s);
if(ans[p][i].l-r<=1e-15&&tf==1)lstans=max(lstans,ans[p][i].s);
}
cout<<lstans<<'\n';
}
return 0;
}
60pts,WA on #1