#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char buf[1 << 14], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 14, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline long long read(long long &x) {
  x = 0;
  bool f = 1;
  char c = gc();
  for (; !isdigit(c); c = gc()) {
    if (c == '-') f ^= 1;
    if (c == -1) return -1;
  }
  for (; isdigit(c); c = gc()) x = (x << 1) + (x << 3) + (c ^ 48);
  x = f ? x : -x;
  return 1;
}
inline void wr(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) wr(x / 10);
  putchar(x % 10 | 48);
}
const long long N = 5010;
long long n, m, a[N], f[2][N], s[N], Q[N], l, r;
struct node {
  long long x, c;
  bool operator<(const node &res) const { return x < res.x; }
} b[N];
int main() {
  read(n), read(m);
  for (long long i = 1; i <= n; ++i) read(a[i]);
  sort(a + 1, a + 1 + n);
  for (long long i = 1; i <= m; ++i) read(b[i].x), read(b[i].c);
  sort(b + 1, b + 1 + m);
  memset(f, 0x3f, sizeof f);
  f[0][0] = 0;
  for (long long i = 1; i <= m; ++i) {
    for (long long j = 1; j <= n; ++j) s[j] = s[j - 1] + abs(a[j] - b[i].x);
    l = 1, r = 0;
    for (long long j = 0; j <= n; ++j) {
      for (; l <= r && Q[l] < j - b[i].c; ++l)
        ;
      for (;
           l <= r && f[(i - 1) & 1][Q[r]] + s[j] - s[Q[r]] >= f[(i - 1) & 1][j];
           --r)
        ;
      Q[++r] = j;
      if (l <= r) f[i & 1][j] = f[(i - 1) & 1][Q[l]] + s[j] - s[Q[l]];
    }
  }
  wr(f[m & 1][n] > 0x3f3f3f3f3f ? -1 : f[m & 1][n]);
  return 0;
}
