#include <bits/stdc++.h>
inline long long ceil_div(long long a, long long b) { return (a + b - 1) / b; }
using namespace std;
inline int qr() {
  int f = 0, fu = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') fu = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    f = (f << 3) + (f << 1) + (c & 15);
    c = getchar();
  }
  return f * fu;
}
const int N = 5e3 + 10;
struct node {
  int p, c;
  inline bool operator<(node a) const { return p < a.p; }
} b[N];
int n, m, a[N], q[N], s[N];
long long sum[N], f[N][N];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= m; i++) scanf("%d%d", &b[i].p, &b[i].c);
  sort(a + 1, a + 1 + n);
  sort(b + 1, b + 1 + m);
  for (int i = 1; i <= m; i++) s[i] = s[i - 1] + b[i].c;
  if (s[m] < n) return puts("-1"), 0;
  memset(f[0] + 1, 0x3f, sizeof(long long) * n);
  for (int i = 1; i <= m; i++)
    for (int j = 0, l = 1, r = 0; j <= n; j++) {
      if (j) sum[j] = sum[j - 1] + abs(a[j] - b[i].p);
      while (l <= r && j - q[l] > b[i].c) l++;
      while (l <= r && f[i - 1][j] - sum[j] <= f[i - 1][q[r]] - sum[q[r]]) r--;
      q[++r] = j;
      f[i][j] = f[i - 1][q[l]] + sum[j] - sum[q[l]];
    }
  printf("%lld\n", f[m][n]);
  return 0;
}
