#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mpr make_pair
#define fr first
#define sc second
inline int read(){
int res=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
return res*f;
}
const int N=1e5+5;
int n,q,c,ans[N];
struct node{int X,I;}qr[N];
bool comp(node o,node p){return o.X<p.X;}
unordered_map<int,int>mp;
pair<int,int>g[N];
vector<int>vec;
int get(int K){
int ans=0;
vector<int>sb;
for (int i=vec.size()-1;i>=0&&!ans;i--){
sb.push_back(K);
if (mp[K]!=0){
ans=mp[K];
break;
}
if (vec[i]!=0) K=(K-1)%vec[i]+1;
}
for (auto i:sb) mp[i]=ans;
return ans;
}
void solve(){
n=read(),q=read(),c=0;
mp.clear();
for (int i=1;i<=n;i++){
int x=read(),y=read();
g[i]=mpr(x,y);
}
for (int i=1;i<=q;i++){
qr[i].X=read();
qr[i].I=i;
}
sort(qr+1,qr+q+1,comp);
vec.clear();
int tip=1;
for (int i=1;i<=n;i++){
int op=g[i].fr,x=g[i].sc;
if (op==1){
mp[++c]=x,vec.push_back(0);
while (qr[tip].X==c&&tip<=q) ans[qr[tip++].I]=x;
}
else{
vec.push_back(c);
while (qr[tip].X<=min(c*x+c,(int)1e18)&&tip<=q) ans[qr[tip].I]=get(qr[tip++].X);
c+=c*x;
}
if (c>1e18||tip>q) break;
}
for (int i=1;i<=q;i++) cout<<ans[i]<<' ';
cout<<'\n';
}
signed main(){
int T=read();
while (T--){
solve();
}
return 0;
}