DP(线段树优化)
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define FRE freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
const int N = 3e5+10;
typedef long long LL;
const LL INF=0x3f3f3f3f3f3f3f3f;
int n,m;
int a[N];
int cold[N],hot[N];
struct SegTree{
int l,r;
LL Min;
LL add;
}tr[N*4];
void pushup(int x){
tr[x].Min=min(tr[x*2].Min,tr[x*2+1].Min);
}
void pushdown(int x){
auto &l=tr[x*2],&r=tr[x*2+1];
if(tr[x].add){
l.Min+=tr[x].add;
r.Min+=tr[x].add;
l.add+=tr[x].add;
r.add+=tr[x].add;
tr[x].add=0;
}
}
void build(int u,int l,int r){
tr[u]={l,r};
if(l==r) {
tr[u].Min=INF;
return ;
}
int mid=l+r>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
}
void modify(int x,int l,int r,LL k){
if(tr[x].l>=l&&tr[x].r<=r) {
tr[x].add+=k;
tr[x].Min+=k;
return ;
}
pushdown(x);
int mid=tr[x].l+tr[x].r>>1;
if(l<=mid) modify(x*2,l,r,k);
if(r>mid) modify(x*2+1,l,r,k);
pushup(x);
}
void modify(int x,int u,LL k){
if(tr[x].l==u&&tr[x].r==u){
tr[x].Min=min(tr[x].Min,k);
return ;
}
pushdown(x);
int mid=tr[x].l+tr[x].r>>1;
if(mid>=u) modify(x*2,u,k);
if(u>mid) modify(x*2+1,u,k);
pushup(x);
}
LL query(int x,int l,int r){
if(tr[x].r<=r&&tr[x].l>=l){
return tr[x].Min;
}
LL Min=1e18;
pushdown(x);
int mid=tr[x].l+tr[x].r>>1;
if(l<=mid) Min=min(query(x*2,l,r),Min);
if(r>mid) Min=min(query(x*2+1,l,r),Min);
return Min;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=m;++i) cin>>cold[i];
for(int i=1;i<=m;++i) cin>>hot[i];
build(1,0,m);
modify(1,0,0);
for(int i=1;i<=n;++i){
LL res=query(1,0,m);
LL res1=query(1,a[i],a[i]);
modify(1,0,m,(a[i]==a[i-1]?hot[a[i]]:cold[a[i]]));
modify(1,a[i-1],min(res+cold[a[i]],res1+hot[a[i]]));
}
cout<<query(1,0,m)<<endl;
}
int main()
{
#ifndef ONLINE_JUDGE
FRE
#endif
IOS
int T;cin>>T;while(T--)
solve();
return 0;
}