#include<bits/stdc++.h>
using namespace std;
#define all(v) ((v).begin()),((v).end())
#define ll long long
#define fastIO cout << fixed << setprecision(12), ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
double const EPS = 1e-12, PI = acos(-1);
const int N = 2e5 + 9, M = 3e3 + 9, OO = 1e9 + 7, MOD = 1e9 + 7;
const ll inf = 1e18;

int arr[N], tree[4*N], lazy[4*N];

//void build(int node, int start, int end) {
//  if(start == end) {
//    tree[node] = arr[start];
//    return;
//  }
//  int mid = (start + end) / 2;
//  build(node * 2, start, mid);
//  build(node * 2 + 1, mid + 1, end);
//  tree[node] = min(tree[node * 2], tree[node * 2 + 1]);
//}
//
//void propagate(int node, int start, int end) {
//  if(!lazy[node])
//    return;
//  tree[node] = lazy[node];
//  if(start != end) {
//    lazy[node * 2] = lazy[node];
//    lazy[node * 2 + 1] = lazy[node];
//  }
//  lazy[node] = 0;
//}
//
//int query(int node, int start, int end, int val, int cnt) {
//  propagate(node, start, end);
//  if(cnt < 0)
//    return -1;
//  if(start == end)
//    return start;
//  int mid = (start + end) / 2;
//  if(tree[node * 2 + 1] < val && (cnt - mid > 0))
//    return query(node * 2 + 1, mid + 1, end, val, cnt - mid);
//  if(tree[node * 2] >= val)
//    return -1;
//  return query(node * 2, start, mid, val, cnt);
//}
//
//
//void update(int node, int start, int end, int l, int r, int vall) {
//  propagate(node, start, end);
//  if(start > r || end < l)
//    return;
//  if(start >= l && end <= r) {
//    lazy[node] = vall;
//    propagate(node, start, end);
//    return;
//  }
//  int mid = (start + end) / 2;
//  update(node * 2, start, mid, l, r, vall);
//  update(node * 2 + 1,mid + 1, end, l, r, vall);
//  tree[node] = min(tree[node * 2], tree[node * 2 + 1]);
//}
//
//ll getMe(int node, int start, int end, int idx) {
//  if(start == end)
//    return tree[node];
//  int mid = (start + end) / 2;
//  if(idx <= mid)
//    return getMe(node * 2, start, mid, idx);
//  else
//    return getMe(node * 2 + 1, mid + 1, end, idx);
//}

int main() {
  fastIO;
#ifdef LOCAL
  freopen("input.in", "rt", stdin);
#endif
  int n, m, a, b;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i)
    cin >> arr[i];
  sort(arr + 1, arr + n + 1);
//  build(1, 1, n);
  vector<pair<int, int>> vec;
  for (int i = 0; i < m; ++i) {
    cin >> a >> b;
    vec.push_back({b, a});
  }
//  sort(vec.begin(), vec.end());
//  for (int i = 0; i < m; ++i) {
//    int cnt = vec[i].second, val = vec[i].first;
//    int idx = query(1, 1, n, val, cnt);
//    cerr << idx << endl;
//    if(idx == -1) continue;
//    update(1, 1, n, 1, idx, val);
//  }
// ll total = 0
//  for (int i = 1; i <= n; ++i) {
//    ll cur = getMe(1, 1, n, i);
//    cerr << cur << endl;
//    total += cur;
//  }
//  cout << total;
  sort(vec.begin(), vec.end(), greater<pair<int, int>>());
  priority_queue<int> qq;
  for (int i = 1; i <= n; ++i)
    qq.push(-arr[i]);
  ll total = 0;
  for (int i = 0; i < m; ++i) {
    int cnt = vec[i].second, val = vec[i].first;
    bool can = 1;
    while(!qq.empty() && cnt) {
      int vv = -qq.top();
      if(vv >= val) {
        can = 0;
        break;
      }
      --cnt;
      total += val;
      qq.pop();
    }
    if(!can)
      break;
  }
  while(!qq.empty()) {
    int vv = -qq.top();
    total += vv;
    qq.pop();
  }
  cout << total;
  return 0;
}


Measured memory_bytes: 2292