#include <bits/stdc++.h>
using namespace std;
//const int MOD=1e9+7;
//const int MOD=998244353;
const int INF=1e9;
const long long LINF=1e18;
#define int long long
//template

template <typename T>
void fin(T a){
  cout<<a<<endl;
  exit(0);
}
typedef pair<int,int> P;
typedef pair<P,P> PP;
template <typename T>
struct SegmentTree{
  using F = function<T(T,T)>;
  int n;  //セグ木の幅
  F f;  //モノイドの作用
  T ti;  //初期値
  vector<T> dat;  //セグ木で使う配列 一番上に使われるのがdat[1] 一番下の段の左端がdat[n]
  SegmentTree(){};
  SegmentTree(F f,T ti):f(f),ti(ti){}  //fがモノイドとしての作用、tiが初期値

  void init(int n_){  //ただの初期化
    n=1;
    while(n<n_) n<<=1;  //nが実際にとる２べきの幅
    dat.assign(n<<1,ti);  //dat配列は幅の２倍あってその全てにtiを代入
  }

  void build(const vector<T> &v){  //vector vに合わせた初期化
    int n_=v.size();
    init(n_);
    for(int i=0;i<n_;i++) dat[n+i]=v[i];  //v[i]を一番子の所に代入
    for(int i=n-1;i;i--)
      dat[i]=f(dat[(i<<1)|0],dat[(i<<1)|1]);  //iの子供は2*i、2*i+1
  }

  void set_val(int k,T x){  //（0-indexedで）kにxを代入
    dat[k+=n]=x;
    while(k>>=1)  //kがどんどん自分の親になっていく、0になったらおしまい
      dat[k]=f(dat[(k<<1)|0],dat[(k<<1)|1]);
  }

  void add_val(int k,T x){
    int a=dat[k+n];
    set_val(k,a+x);
  }

  T query(int a,int b){  //[a,b)の範囲のモノイドの作用を返す
    T vl=ti,vr=ti;
    for(int l=a+n,r=b+n;l<r;l>>=1,r>>=1) {
      if(l&1) vl=f(vl,dat[l++]);  //左端を使いたくなるのはブロックが奇数の時
      if(r&1) vr=f(dat[--r],vr);  //右端〃偶数の時（開区間なのでr:奇数で反応）
    }
    return f(vl,vr);
  }

  template<typename C>
  int find(int st,C &check,T &acc,int k,int l,int r){  //dat[k]:[l,r)の間にいるenを返す
    //下のfind用なので先にそっち読むべき
    //accはst~lとかで確定している値
    if(l+1==r){  //答えがちゃんと存在するならこのlが答え
      acc=f(acc,dat[k]);
      return check(acc)?k-n:-1; //入るならk-n(==l)を、入らないなら-1を返す
    }
    int m=(l+r)>>1;  //にぶたんのそれ
    if(m<=st) return find(st,check,acc,(k<<1)|1,m,r);  //mがstより後ろなら明らかにl=m;
    if(st<=l&&!check(f(acc,dat[k]))){  //今見てるk全部でもダメ(mだと足りないのでl=mにする）
      acc=f(acc,dat[k]);  //kは全部accに加えた上で-1を返す
      return -1;
    }
    int vl=find(st,check,acc,(k<<1)|0,l,m);  //まず[l,m)の中にenがいるか探す
    if(~vl) return vl;  //いたならそれを返す(if(~vl)は-1以外にのみ反応する)
    return find(st,check,acc,(k<<1)|1,m,r);  //いなかったら[m,r)の中にenがいるのでそれを返す
    //acc=f(acc,dat[k]);がここで効いてる
  }

  template<typename C>
  int find(int st,C &check){
    //check(f(dat[st]~dat[en-1]))=false,check(f(dat[st]~dat[en]))＝trueとなるenを返す
    T acc=ti;
    return find(st,check,acc,1,0,n);
  }
};
int pw(int n,int k){
  //if(k<0)return pw(n,k+MOD-1);
  int res=1;
  while(k){
    if(k&1)res*=n;//res%=MOD;
    n*=n;//n%=MOD;
    k>>=1;
  }
  return res;
}
char st(int a,int b){
  string s;
  while(a){
    s+=('0'+a%10);a/=10;
  }
  reverse(s.begin(),s.end());
  return s[b-1];
}
//main
signed main(){
  int N,M,Q;cin>>N>>M;
  vector<int> a(N),b(M),ae(N),as(N),be(M),bs(M);
  int EI=1e8;
  for(int i=0;i<N;i++){
    cin>>a[i];
    int j=1;while(a[i]>=pw(10,j))j++;j--;
    ae[i]=a[i]*EI/pw(10,j);as[i]=j;
  } //make as&ae
  for(int i=0;i<M;i++){
    cin>>b[i];
    int j=1;while(b[i]>=pw(10,j))j++;j--;
    be[i]=b[i]*EI/pw(10,j);bs[i]=j;
  } //make bs&be

  int sum_bs=0;for(int i=0;i<M;i++)sum_bs+=bs[i];

  cin>>Q;  vector<int> d(Q);
  for(int i=0;i<Q;i++)cin>>d[i];

  //for(int i=0;i<N;i++)cout<<as[i]<<" ";cout<<endl;
  //for(int i=0;i<M;i++)cout<<bs[i]<<" ";cout<<endl;
  //cout<<sum_bs<<endl;

  vector<int> afin(N+1,0);//afin[i+1]:a[i]が終わった時の合計文字数
  vector<P> sorted_be(M);
  for(int i=0;i<M;i++)sorted_be[i]=P(be[i],i);
  sort(sorted_be.begin(),sorted_be.end());
  for(int i=0;i<N;i++){
    int l=-1,r=M;//a[i]*sorted_be[l]がギリギリ1e17を超えないライン
    while(r-l>1){
      int m=(l+r)/2;
      int X=sorted_be[m].first;
      if(ae[i]*X<1e17)l=m;
      else r=m;
    }
    afin[i+1]=afin[i]+sum_bs+(as[i]+1)*M+M-r;//l+1が繰り上がりの数
  }
  std::vector<char> ans(Q);

  set<PP> s;//sに入るのは(i番目の答えが入る行に書かれた数字、行の名前、その行で必要な個数、i)
  for(int i=0;i<Q;i++){
    int D=d[i];if(afin[N]<D){ans[i]='x';continue;}
    int l=-1,r=N;//Dがいるのはr行目  lはギリギリafin[l+1]<Dを満たす
    while(r-l>1){
      int m=(l+r)/2;
      if(afin[m+1]<D)l=m;
      else r=m;
    }
    s.insert(PP(P(ae[r],r),P(D-afin[l+1],i)));
    //cout<<a[r]<<" "<<r<<" "<<D-afin[l+1]<<" "<<i<<endl;
  }
  auto f=[](int a,int b){return a+b;};
  SegmentTree<int> seg(f,0);
  seg.build(bs);
  int now=0;
  reverse(sorted_be.begin(),sorted_be.end());
  for(auto p:s){
    int A=p.first.first,columm=p.first.second,row=p.second.first;
    while(now<M&&sorted_be[now].first*A>=1e17){
      seg.add_val(sorted_be[now].second,1);
      now++;
    }
    int l=-1,r=M;//seg.query(0,l)っぽいのがギリギリrowより小さいやつ
    while(r-l>1){
      int m=(l+r)/2;
      if(seg.query(0,m)+(as[columm]+1)*m<row)l=m;
      else r=m;
    }
    int res=row-(seg.query(0,l)+(as[columm]+1)*l);
    int R=a[columm]*b[l];
    //cout<<"ERT"<<p.second.second<<" "<<r<<" "<<res<<" "<<R<<" "<<seg.query(0,l)<<endl;
    ans[p.second.second]=st(R,res);
  }
  for(int i=0;i<Q;i++)cout<<ans[i];cout<<endl;
}



Measured memory_bytes: 35572