#include <bits/stdc++.h>
using namespace std;
int n, u, r;
long long at[50], a[50], res;
int b[50], k[50], pr[50];
void check() {
  long long s = 0;
  for (int i = 0; i < (n); i++) s += a[i] * k[i];
  res = max(res, s);
}
void busca(int p, int can) {
  if (p == u) {
    check();
    return;
  }
  if ((u - p) % 2 == 0) check();
  if (can) {
    for (int i = 0; i < (n); i++) a[i] ^= b[i];
    busca(p + 1, 0);
    for (int i = 0; i < (n); i++) a[i] ^= b[i];
  }
  for (int i = 0; i < (n); i++) at[i] = a[pr[i]] + r;
  for (int i = 0; i < (n); i++) a[i] = at[i];
  busca(p + 1, 1);
  for (int i = 0; i < (n); i++) at[pr[i]] = a[i] - r;
  for (int i = 0; i < (n); i++) a[i] = at[i];
}
int main() {
  while (scanf("%d%d%d", &n, &u, &r) == 3) {
    for (int i = 0; i < (n); i++) scanf("%lld", &a[i]);
    for (int i = 0; i < (n); i++) scanf("%d", &b[i]);
    for (int i = 0; i < (n); i++) scanf("%d", &k[i]);
    for (int i = 0; i < (n); i++) {
      scanf("%d", &pr[i]);
      pr[i]--;
    }
    res = -0x3f3f3f3f3f3f3f3fLL;
    busca(0, 1);
    printf("%I64d\n", res);
  }
  return 0;
}
