#include using namespace std; // output stream #define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl template ostream& operator << (ostream &s, const pair &P) { return s << '<' << P.first << ", " << P.second << '>'; } template ostream& operator << (ostream &s, const array &P) { return s << '<' << P[0] << "," << P[1] << '>'; } template ostream& operator << (ostream &s, const array &P) { return s << '<' << P[0] << "," << P[1] << "," << P[2] << '>'; } template ostream& operator << (ostream &s, const array &P) { return s << '<' << P[0] << "," << P[1] << "," << P[2] << "," << P[3] << '>'; } template ostream& operator << (ostream &s, const vector &P) { for (int i = 0; i < P.size(); ++i) { s << P[i] << endl; } return s; } template ostream& operator << (ostream &s, const vector &P) { for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; } template ostream& operator << (ostream &s, const deque &P) { for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; } template ostream& operator << (ostream &s, const vector> &P) { for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; } template ostream& operator << (ostream &s, const set &P) { for (auto it : P) { s << "<" << it << "> "; } return s; } template ostream& operator << (ostream &s, const multiset &P) { for (auto it : P) { s << "<" << it << "> "; } return s; } template ostream& operator << (ostream &s, const unordered_set &P) { for (auto it : P) { s << "<" << it << "> "; } return s; } template ostream& operator << (ostream &s, const map &P) { for (auto it : P) { s << "<" << it.first << "->" << it.second << "> "; } return s; } template ostream& operator << (ostream &s, const unordered_map &P) { for (auto it : P) { s << "<" << it.first << "->" << it.second << "> "; } return s; } //------------------------------// // Examples //------------------------------// int main() { int N, M, K; long long INF = 1LL << 40; cin >> N >> M >> K; vector A(N), B(M); for (int i = 0; i < N; i++) cin >> A[i]; for (int i = 0; i < M; i++) cin >> B[i], B[i]--; vector dp(1 << N, 0); for (int S = 0; S < (1 << N); S++) { for (int i = 0; i < N; i++) if (!(S >> i & 1)) dp[S] += A[i]; } for (int iter = 0; iter < M; iter++) { vector nex(1 << N, INF); for (int S = 0; S < (1 << N); S++) { int canchange = ((1 << N) - 1) ^ S; for (int change = canchange; ;change = (change - 1) & canchange) { int S2 = S ^ change; long long add = 0; for (int i = 0; i < N; i++) { if (!(S >> i & 1)) continue; if (!(S2 >> ((i+1)%N) & 1) || !(S2 >> ((i-1+N)%N) & 1)) add += K; } nex[S2] = min(nex[S2], dp[S] + add); if (!change) break; } } swap(dp, nex); for (int S = 0; S < (1 << N); S++) if (!(S >> B[iter] & 1)) dp[S] = min(dp[S], dp[S + (1 << B[iter])]); cout << dp[0] << endl; } }