#include <bits/stdc++.h>
using namespace std;
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const double EPS = 1e-9;
const double PI = acos(-1.);
const long long LL_INF = 1e17 + 16;
const int INF = 1e9 + 10;
const long long MOD = 998244353;
const int MAXN = 35;
int n, r, u;
long long ans = -LL_INF;
int a[MAXN], b[MAXN], k[MAXN], per[MAXN], per_inv[MAXN], tmp[MAXN];
void rec_sol(int level, bool two_ops) {
  if (level % 2 == 0) {
    long long cur = 0;
    for (int i = (0); i < (int)(n); i++) {
      cur += a[i] * k[i];
    }
    ans = max(ans, cur);
  }
  if (level == 0) {
    return;
  }
  if (two_ops) {
    for (int i = (0); i < (int)(n); i++) {
      a[i] ^= b[i];
    }
    rec_sol(level - 1, false);
    for (int i = (0); i < (int)(n); i++) {
      a[i] ^= b[i];
    }
  }
  for (int i = (0); i < (int)(n); i++) {
    tmp[i] = a[per[i]] + r;
  }
  for (int i = (0); i < (int)(n); i++) {
    a[i] = tmp[i];
  }
  rec_sol(level - 1, true);
  for (int i = (0); i < (int)(n); i++) {
    tmp[i] = a[per_inv[i]] - r;
  }
  for (int i = (0); i < (int)(n); i++) {
    a[i] = tmp[i];
  }
}
void solve() {
  scanf("%d%d%d", &n, &u, &r);
  for (int i = (0); i < (int)(n); i++) {
    scanf("%d", &a[i]);
  }
  for (int i = (0); i < (int)(n); i++) {
    scanf("%d", &b[i]);
  }
  for (int i = (0); i < (int)(n); i++) {
    scanf("%d", &k[i]);
  }
  for (int i = (0); i < (int)(n); i++) {
    scanf("%d", &per[i]);
    per[i]--;
    per_inv[per[i]] = i;
  }
  rec_sol(u, true);
  printf("%lld\n", ans);
}
int main() {
  int t = 1;
  while (t--) {
    solve();
  }
}
