#include <bits/stdc++.h>
using namespace std;
template <class T>
bool chmax(T& a, const T& b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool chmin(T& a, const T& b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
T div_floor(T a, T b) {
  if (b < 0) a *= -1, b *= -1;
  return a >= 0 ? a / b : (a + 1) / b - 1;
}
template <class T>
T div_ceil(T a, T b) {
  if (b < 0) a *= -1, b *= -1;
  return a > 0 ? (a - 1) / b + 1 : a / b;
}
constexpr long long mod = 1000000007;
constexpr long long INF = mod * mod;
constexpr int MAX = 200010;
namespace atcoder {
namespace internal {
int ceil_pow2(int n) {
  int x = 0;
  while ((1U << x) < (unsigned int)(n)) x++;
  return x;
}
int bsf(unsigned int n) { return __builtin_ctz(n); }
}  // namespace internal
}  // namespace atcoder
namespace atcoder {
template <class S, S (*op)(S, S), S (*e)()>
struct segtree {
 public:
  segtree() : segtree(0) {}
  segtree(int n) : segtree(std::vector<S>(n, e())) {}
  segtree(const std::vector<S>& v) : _n(int(v.size())) {
    log = internal::ceil_pow2(_n);
    size = 1 << log;
    d = std::vector<S>(2 * size, e());
    for (int i = 0; i < _n; i++) d[size + i] = v[i];
    for (int i = size - 1; i >= 1; i--) {
      update(i);
    }
  }
  void set(int p, S x) {
    assert(0 <= p && p < _n);
    p += size;
    d[p] = x;
    for (int i = 1; i <= log; i++) update(p >> i);
  }
  S get(int p) {
    assert(0 <= p && p < _n);
    return d[p + size];
  }
  S prod(int l, int r) {
    assert(0 <= l && l <= r && r <= _n);
    S sml = e(), smr = e();
    l += size;
    r += size;
    while (l < r) {
      if (l & 1) sml = op(sml, d[l++]);
      if (r & 1) smr = op(d[--r], smr);
      l >>= 1;
      r >>= 1;
    }
    return op(sml, smr);
  }
  S all_prod() { return d[1]; }
  template <bool (*f)(S)>
  int max_right(int l) {
    return max_right(l, [](S x) { return f(x); });
  }
  template <class F>
  int max_right(int l, F f) {
    assert(0 <= l && l <= _n);
    assert(f(e()));
    if (l == _n) return _n;
    l += size;
    S sm = e();
    do {
      while (l % 2 == 0) l >>= 1;
      if (!f(op(sm, d[l]))) {
        while (l < size) {
          l = (2 * l);
          if (f(op(sm, d[l]))) {
            sm = op(sm, d[l]);
            l++;
          }
        }
        return l - size;
      }
      sm = op(sm, d[l]);
      l++;
    } while ((l & -l) != l);
    return _n;
  }
  template <bool (*f)(S)>
  int min_left(int r) {
    return min_left(r, [](S x) { return f(x); });
  }
  template <class F>
  int min_left(int r, F f) {
    assert(0 <= r && r <= _n);
    assert(f(e()));
    if (r == 0) return 0;
    r += size;
    S sm = e();
    do {
      r--;
      while (r > 1 && (r % 2)) r >>= 1;
      if (!f(op(d[r], sm))) {
        while (r < size) {
          r = (2 * r + 1);
          if (f(op(d[r], sm))) {
            sm = op(d[r], sm);
            r--;
          }
        }
        return r + 1 - size;
      }
      sm = op(d[r], sm);
    } while ((r & -r) != r);
    return 0;
  }

 private:
  int _n, size, log;
  std::vector<S> d;
  void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
};
}  // namespace atcoder
using namespace atcoder;
int target;
struct monoid {
  int val;
  static monoid op(monoid lhs, monoid rhs) { return {lhs.val + rhs.val}; }
  static monoid e() { return {0}; }
  static bool f(monoid x) { return x.val <= target; }
};
int main() {
  long long n;
  int m, q;
  scanf("%lld%d%d", &n, &m, &q);
  int cnt[m];
  memset(cnt, 0, sizeof(cnt));
  for (int((i)) = (int)(0); ((i)) < (int)((n)); ++((i))) {
    int a;
    scanf("%d", &a);
    ++cnt[a - 1];
  }
  pair<long long, int> qs[q];
  for (int((i)) = (int)(0); ((i)) < (int)((q)); ++((i)))
    scanf("%lld", &qs[i].first), qs[i].second = i;
  sort(qs, qs + q);
  pair<int, int> ps[m];
  for (int((i)) = (int)(0); ((i)) < (int)((m)); ++((i))) ps[i] = {cnt[i], i};
  sort(ps, ps + m);
  segtree<monoid, monoid::op, monoid::e> st(m);
  int ans[q];
  int qcur = 0;
  for (int l = 0; l < m;) {
    int r = l;
    while (r < m && ps[l].first == ps[r].first) {
      st.set(ps[r].second, {1});
      ++r;
    }
    long long nn = (r == m ? INF : 1LL * r * (ps[r].first - ps[l].first) + n);
    while (qcur < q && qs[qcur].first <= nn) {
      int tmp = (qs[qcur].first - n) % r;
      tmp = (tmp == 0 ? r - 1 : tmp - 1);
      target = tmp;
      ans[qs[qcur].second] = st.max_right<monoid::f>(0) + 1;
      ++qcur;
    }
    l = r;
    n = nn;
  }
  for (int((i)) = (int)(0); ((i)) < (int)((q)); ++((i))) printf("%d\n", ans[i]);
}
