//与楼主两点不同: 1.multimap改为multiset 
//2.存储就餐人数、消费额时用vector,v[0]是消费额,v[1]是消费人数
//之所以消费额放前面就是为了排序时以消费额为准,这样不再需要自定义结构体和比较函数
//昨晚没想起来用multiset,更没想起来用其成员函数lower_bound,只是从头到尾搜索,也没用long long,结果50%
#include<iostream>
#include<vector>
#include<algorithm>
#include<set>

using namespace std;

int main()
{
    int n , m, x, y;
    cin >> n >> m;

    multiset<int> table;
    for(int i = 0; i < n; ++i)
    {
        cin >> x;
        table.insert(x);
    }

    vector<vector<int> > guest;
    for(int i = 0; i < m; ++i)
    {
        cin >> x >> y;
        guest.push_back({y, x}); //x:人数 y:消费额,y放vector的前面,排序时以消费额为准
    }
    sort(guest.begin(),guest.end(), greater<vector<int> >());

    long long maxValue = 0;
    for(int i = 0; i < m && !table.empty(); ++i)
    {
        auto it = table.lower_bound(guest[i][1]); //guest[i][1]就餐人数
        if(it != table.end())
        {
            maxValue += guest[i][0]; //guest[i][0]消费额
            table.erase(it);
        }
    }
    cout << maxValue <<endl;
    return 0;
}