优先队列
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
struct Node
{
int d,p;
friend bool operator<(Node x,Node y)
{
return x.p>y.p;
}
}a[110000];
int b[110000];
bool cmp1(int x,int y)
{
return x>y;
}
bool cmp2(Node x,Node y)
{
return x.d>y.d;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
priority_queue<Node> q;
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=m;i++)
scanf("%d",&a[i].d);
for(int i=1;i<=m;i++)
scanf("%d",&a[i].p);
sort(b+1,b+1+n,cmp1);
sort(a+1,a+1+m,cmp2);
__int64 ans=0;
int cnt=1;
int flag;
for(int i=1;i<=n;i++)
{
flag=0;
while(cnt<=m&&a[cnt].d>=b[i])
{
q.push(a[cnt++]);
}
if(q.empty())
{
flag=1;
break;
}
else
{
ans+=(__int64)q.top().p;
q.pop();
}
}
if(flag)
cout<<"No"<<endl;
else
cout<<ans<<endl;
}
return 0;
}