反悔贪心。
die码:
#include <bits/stdc++.h>
#define ll long long
#define rll register ll
#define cll const ll
#define N 1000005
using namespace std;
inline ll read()
{
rll x=0;bool f=1;register char c=getchar();
while(c<48||c>57){if(c=='-') f=0;c=getchar();}
while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
return f?x:-x;
}
inline void write(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+48);
}
ll n,m,k,ans,val,c[N],r[N];
priority_queue<ll,vector<ll>,greater<ll>> q;
struct node{ll p,q;}h[N];
inline bool cmp(node x,node y)
{
if(x.p==y.p) return x.q>y.q;
return x.p>y.p;
}
int main()
{
n=read(),m=read(),k=read();
for(rll i=1;i<=n;i++) c[i]=read();
sort(c+1,c+n+1,greater<ll>());
for(rll i=1;i<=m;i++)
h[i].q=read(),h[i].p=read();
sort(h+1,h+m+1,cmp);
for(rll i=1;i<=k;i++) r[i]=read();
sort(r+1,r+k+1,greater<ll>());
for(rll i=1,j=1;i<=n;i++)
{
if(j>k)
{
q.push(0);
continue;
}
val=0;
while(j<=k&&h[j].q<c[i])
{
val+=h[j].p*h[j].q;
c[i]-=h[j].q,h[j].q=0,j++;
}
if(j<=k)
{
val+=c[i]*h[j].p;
h[j].q-=c[i],c[i]=0;
}
ans+=val,q.push(val);
}//先把能卖奶的都卖了
for(rll i=1;i<=k;i++)
{
if(q.empty()) break;
cll x=q.top();
if(r[i]>x)
ans+=r[i]-x,q.pop();
}//如果租出去更优,反悔!
write(ans);
return 0;
}