#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>P;
typedef vector<ll>V;
const int N=50005;
int Case,n,q,i,x,cnt,ce,ans[N];ll A,B;
struct E{V s;int t;}e[N*3];
inline int compare(const V&a,const V&b){
int n=a.size(),m=b.size(),i;
if(a[0]!=b[0])return a[0]<b[0]?-1:1;//先按gcd比较
for(i=1;i<n&&i<m;i+=2){
if(a[i]!=b[i])return a[i]<b[i]?-1:1;
if(!a[i])return 0;//注意这里把之前塞的0特判掉
if(a[i+1]<b[i+1]){
if(i+2>=n)return -1;
return a[i+2]<b[i]?-1:1;
}
if(a[i+1]>b[i+1]){
if(i+2>=m)return 1;
return a[i]<b[i+2]?-1:1;
}
}
if(i<n)return 1;
if(i<m)return -1;
return 0;
}
inline bool cmp(const E&a,const E&b){
int sgn=compare(a.s,b.s);
if(sgn)return sgn<0;//如果至少有一个是询问串,且另一个串和这个询问串公共长度部分相同,那么把询问串排在最后
return a.t<b.t;//这里要仔细理解串与串的序关系,可以发现仍然是一个偏序
}
inline P decode(const V&s){//这个函数好像没用到
P ret(s[0],s[0]);
for(int i=1;i+1<s.size();i+=2){
if(s[i]==-1)ret.first+=ret.second*s[i+1];
else ret.second+=ret.first*s[i+1];
}
return ret;
}
inline V zip(P p){
V s;
while(1){
if(p.first==p.second)break;
if(p.first>p.second){
ll old=p.first;
p.first%=p.second;
if(!p.first)p.first=p.second;
s.push_back((old-p.first)/p.second);
s.push_back(-1);
}else{
ll old=p.second;
p.second%=p.first;
if(!p.second)p.second=p.first;
s.push_back((old-p.second)/p.first);
s.push_back(-2);
}
}
s.push_back(p.first);
reverse(s.begin(),s.end());
return s;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>Case;
while(Case--){
cin>>n>>q;
ce=0;
for(i=1;i<=n;i++){
cin>>A>>B;
e[++ce].t=0;
e[ce].s=zip(P(A,B));
}
for(i=1;i<=q;i++){//塞入两个串,分别是S和S+(char)0
ans[i]=0;
cin>>A>>B;
V s=zip(P(A,B));
e[++ce].t=-i;
e[ce].s=s;
e[++ce].t=i;
s.push_back(0);
e[ce].s=s;
}
sort(e+1,e+ce+1,cmp);
cnt=0;
for(i=1;i<=ce;i++){
x=e[i].t;
if(!x)cnt++;
if(x>0)ans[x]+=cnt;
if(x<0)ans[-x]-=cnt;
}
for(i=1;i<=q;i++)cout<<ans[i]<<endl;
}
}