#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<stack>
#include<queue>
#include<string.h>
#include<array>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long
const int maxn = 5e5;
const int oo = 1e18;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<int> S(N + 1), W(M + 1), dep(2 * M + 1);
for(int i = 1; i <= N; i++){
cin >> S[i];
}
for(int i = 1; i <= M; i++){
cin >> W[i];
}
for(int i = 1; i <= 2 * M; i++){
cin >> dep[i];
}
multiset<int> st;
for(int i = 1; i <= N; i++){
st.insert(i);
}
vector<int> B(M + 1);
queue<int> pq;
int cur = 0;
for(int i = 1; i <= 2 * M; i++){
if(dep[i] > 0){
pq.push(dep[i]);
}
else{
st.insert(B[-dep[i]]);
}
while(!st.empty() && !pq.empty()){
int P = pq.front();
pq.pop();
int F = *st.begin();
st.erase(st.begin());
cur += S[F] * W[P];
B[P] = F;
}
// if(!st.empty()){
// if(dep[i] >= 0){
// int P = pq.top();
// pq.pop();
// cur += st.begin() * W[P];
// st.erase(st.begin());
// B[dep[i]] = st.begin();
// pq.pop();
// }
// else{
// st.insert(B[-dep[i]]);
// }
// }
// else{
// if(dep[i] >= 0){
// pq.push(dep[i]);
// }
// else{
// st.insert(B[-dep[i]]);
// }
// }
}
cout << cur;
}