#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define L T[o].lc
#define R T[o].rc
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-‘0‘;
return x*f;
}
typedef long long ll;
const int maxn=50010;
const int inf=2e9;
int D;
struct Node {
int mx[2],mn[2],x[2],lc,rc,v;
ll s;
bool operator < (const Node& ths) const {return x[D]<ths.x[D];}
}T[maxn],x;
void maintain(int o) {
T[o].s=T[L].s+T[R].s+T[o].v;
rep(c,0,1) {
T[o].mn[c]=min(min(T[L].mn[c],T[R].mn[c]),T[o].x[c]);
T[o].mx[c]=max(max(T[L].mx[c],T[R].mx[c]),T[o].x[c]);
}
}
void build(int& o,int l,int r,int cur) {
o=0;if(l>r) return;
int mid=l+r>>1;D=cur;nth_element(T+l,T+mid,T+r+1);
o=mid;build(L,l,mid-1,cur^1);build(R,mid+1,r,cur^1);
maintain(o);
}
int a,b,c;
int in(int x,int y) {return (ll)a*x+(ll)b*y<c;}
int check(int o) {
int cnt=0;
if(in(T[o].mn[0],T[o].mn[1])) cnt++;
if(in(T[o].mn[0],T[o].mx[1])) cnt++;
if(in(T[o].mx[0],T[o].mn[1])) cnt++;
if(in(T[o].mx[0],T[o].mx[1])) cnt++;
if(!cnt) return 0;
if(cnt==4) return 1;
return -1;
}
ll query(int o) {
if(!o) return 0;
int f=check(o);
if(!f) return 0;
if(f==1) return T[o].s;
return query(L)+query(R)+T[o].v*in(T[o].x[0],T[o].x[1]);
}
int n,m,rt;
int main() {
T[0].mn[0]=T[0].mn[1]=inf;
T[0].mx[0]=T[0].mx[1]=-inf;
n=read();m=read();
rep(i,1,n) T[i].x[0]=read(),T[i].x[1]=read(),T[i].v=read();
build(rt,1,n,0);
rep(i,1,m) {
a=read();b=read();c=read();
printf("%lld\n",query(rt));
}
return 0;
}