#include <bits/stdc++.h>
using namespace std;
inline int read() {
  register int x = 0, f = 1;
  register char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = 0;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + (ch ^ '0');
    ch = getchar();
  }
  return f ? x : -x;
}
const int N = 5e3 + 5;
const long long inf = 1e16;
int n, m, q[N], hd, tl, sum;
long long s[N], f[N][N];
struct node {
  int x, c;
} mice[N], hole[N];
inline bool operator<(const node &a, const node &b) { return a.x < b.x; }
inline long long g(int i, int k) { return f[i - 1][k] - s[k]; }
inline void chkmin(long long &x, long long y) { x = x < y ? x : y; }
int main() {
  n = read(), m = read();
  for (int i = (1), _ed = (n); i <= _ed; ++i) mice[i] = (node){read()};
  for (int i = (1), _ed = (m); i <= _ed; ++i)
    hole[i] = (node){read(), read()}, sum += hole[i].c;
  if (sum < n) return puts("-1"), 0;
  sort(mice + 1, mice + n + 1);
  sort(hole + 1, hole + m + 1);
  for (int j = (1), _ed = (n); j <= _ed; ++j)
    s[j] = s[j - 1] + abs(hole[1].x - mice[j].x), f[1][j] = inf;
  ;
  for (int i = (1), _ed = (min(hole[1].c, n)); i <= _ed; ++i) f[1][i] = s[i];
  for (int i = (2), _ed = (m); i <= _ed; ++i) {
    for (int j = (1), _ed = (n); j <= _ed; ++j)
      s[j] = s[j - 1] + abs(hole[i].x - mice[j].x), f[i][j] = inf;
    hd = 1, tl = 0;
    q[++tl] = 0;
    for (int j = (1), _ed = (n); j <= _ed; ++j) {
      while (hd <= tl && g(i, q[tl]) >= g(i, j)) --tl;
      q[++tl] = j;
      while (hd <= tl && q[hd] < j - hole[i].c) ++hd;
      f[i][j] = s[j] + g(i, q[hd]);
    }
  }
  printf("%lld\n", f[m][n]);
  return 0;
}
