#include <bits/stdc++.h>
using namespace std;
template <class t>
inline t read(t &x) {
  char c = getchar();
  bool f = 0;
  x = 0;
  while (!isdigit(c)) f |= c == '-', c = getchar();
  while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  if (f) x = -x;
  return x;
}
template <class t>
inline void write(t x) {
  if (x < 0)
    putchar('-'), write(-x);
  else {
    if (x > 9) write(x / 10);
    putchar('0' + x % 10);
  }
}
template <class t>
inline void writeln(t x) {
  write(x);
  putchar('\n');
  return;
}
template <class t>
inline void write_blank(t x) {
  write(x);
  putchar(' ');
  return;
}
struct node {
  long long x, v;
} h[5010];
long long n, m, l, r, mc[5010], sum[5010], p[5010], dp[5010][5010], q[5010],
    no = -1;
namespace bsfc {
bool cmp1(long long _, long long __) { return _ < __; }
bool cmp2(node _, node __) { return _.x < __.x; }
}  // namespace bsfc
signed main() {
  read(n);
  read(m);
  memset(dp, 63, sizeof(dp));
  dp[0][0] = 0;
  for (long long i = 1; i <= n; i++) {
    read(mc[i]);
  }
  for (long long i = 1; i <= m; i++) {
    read(h[i].x);
    read(h[i].v);
  }
  sort(mc + 1, mc + n + 1, bsfc::cmp1);
  sort(h + 1, h + m + 1, bsfc::cmp2);
  for (long long i = 1; i <= m; i++) {
    p[i] = p[i - 1] + h[i].v;
  }
  if (p[m] < n) {
    write(no);
    return 0;
  }
  for (long long i = 1; i <= m; i++) {
    l = 0;
    r = 0;
    dp[i][0] = 0;
    q[++r] = 0;
    for (long long j = 1; j <= p[i] && j <= n; j++) {
      dp[i][j] = dp[i - 1][j];
      sum[j] = sum[j - 1] + abs(mc[j] - h[i].x);
      while (j - q[l] > h[i].v) {
        l++;
      }
      while (l <= r && dp[i - 1][q[l]] - sum[q[l]] > dp[i - 1][j] - sum[j]) {
        l++;
      }
      q[++r] = j;
      dp[i][j] = min(dp[i][j], sum[j] + dp[i - 1][q[l]] - sum[q[l]]);
    }
  }
  write(dp[m][n]);
  return 0;
}
