#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int inf = 1000000001;
struct student {
  int b, c, ind;
};
struct bug {
  int v, ind;
};
int N, M, S;
int res[MAXN], tree[4 * MAXN], CopyC[MAXN];
bug a[MAXN];
student W[MAXN];
vector<int> Q;
bool compare(student x, student y) {
  if (x.b < y.b)
    return true;
  else
    return false;
}
bool cmp(bug x, bug y) {
  if (x.v < y.v)
    return true;
  else
    return false;
}
void build_tree(int v, int tl, int tr) {
  if (tl == tr) {
    tree[v] = tl;
    return;
  }
  int mid = (tl + tr) / 2;
  build_tree(2 * v, tl, mid);
  build_tree(2 * v + 1, mid + 1, tr);
  if (W[tree[2 * v]].c < W[tree[2 * v + 1]].c)
    tree[v] = tree[2 * v];
  else
    tree[v] = tree[2 * v + 1];
}
int Get_Min(int v, int tl, int tr, int l, int r) {
  if (tl > r || tr < l) return 0;
  l = max(tl, l);
  r = min(tr, r);
  if (tl == l && tr == r) {
    return tree[v];
  }
  int mid = (tl + tr) / 2;
  int x = Get_Min(2 * v, tl, mid, l, r);
  int y = Get_Min(2 * v + 1, mid + 1, tr, l, r);
  if (W[x].c < W[y].c)
    return x;
  else
    return y;
}
void modify(int v, int tl, int tr, int pos) {
  if (tl == tr) {
    swap(W[tl].c, CopyC[tl]);
    return;
  }
  int mid = (tl + tr) / 2;
  if (mid >= pos)
    modify(2 * v, tl, mid, pos);
  else
    modify(2 * v + 1, mid + 1, tr, pos);
  if (W[tree[2 * v]].c < W[tree[2 * v + 1]].c)
    tree[v] = tree[2 * v];
  else
    tree[v] = tree[2 * v + 1];
}
bool possible(int p) {
  int Sum = 0, pntM = M, pntN = N;
  {
    for (int i = Q.size() - 1; i >= 0; i--) {
      modify(1, 1, N, Q[i]);
      Q.pop_back();
    }
  }
  while (pntM > 0) {
    while (W[pntN].b >= a[pntM].v && pntN > 0) pntN--;
    pntN++;
    if (pntN > N) return false;
    int best = Get_Min(1, 1, N, pntN, N);
    Sum += W[best].c;
    modify(1, 1, N, best);
    Q.push_back(best);
    if (Sum > S) return false;
    pntM -= p;
  }
  return true;
}
int main() {
  cin >> N >> M >> S;
  for (int i = 1; i <= M; i++) {
    cin >> a[i].v;
    a[i].ind = i;
  }
  sort(a + 1, a + M + 1, cmp);
  for (int i = 1; i <= N; i++) cin >> W[i].b;
  for (int i = 1; i <= N; i++) {
    cin >> W[i].c;
    CopyC[i] = inf;
    W[i].ind = i;
    W[i].ind = i;
  }
  W[0].c = inf;
  sort(W + 1, W + N + 1, compare);
  build_tree(1, 1, N);
  if (!possible(M)) {
    cout << "NO" << endl;
    return 0;
  } else
    cout << "YES" << endl;
  int l = 1, r = M;
  while (r - l > 1) {
    int mid = (l + r) / 2;
    if (possible(mid))
      r = mid;
    else
      l = mid;
  }
  int ans;
  if (possible(l)) {
    ans = l;
  } else {
    ans = r;
    bool x = possible(r);
  }
  int j = M;
  for (int i = 0; i < Q.size(); i++) {
    for (int k = 1; k <= ans; k++) {
      if (j > 0) {
        res[a[j].ind] = W[Q[i]].ind;
        j--;
      }
    }
  }
  for (int i = 1; i <= M; i++) cout << res[i] << " ";
  cout << endl;
  return 0;
}
