#include <bits/stdc++.h>
using namespace std;
const long long N = 5e3 + 10;
inline long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
long long x[N];
struct node {
  long long p, c;
  bool operator<(const node &A) const { return p < A.p; }
} a[N];
long long dp[N][N];
long long s1[N], sum[N];
long long head, tail;
long long K[N];
signed main() {
  long long n, m;
  n = read(), m = read();
  for (long long i = 1; i <= n; i++) x[i] = read();
  for (long long i = 1; i <= m; i++) a[i].p = read(), a[i].c = read();
  sort(x + 1, x + n + 1);
  sort(a + 1, a + m + 1);
  for (long long i = 1; i <= m; i++) s1[i] += s1[i - 1] + a[i].c;
  if (s1[m] < n) {
    printf("-1");
    return 0;
  }
  for (long long i = 1; i <= n; i++) dp[0][i] = 0x3f3f3f3f3f3f3f3fll;
  for (long long i = 1; i <= m; i++) {
    for (long long j = 1; j <= n; j++) sum[j] = sum[j - 1] + abs(a[i].p - x[j]);
    head = 1;
    tail = 0;
    for (long long j = 0; j <= n; j++) {
      while (head <= tail && K[head] < j - a[i].c) head++;
      while (head <= tail &&
             dp[i - 1][j] - sum[j] <= dp[i - 1][K[tail]] - sum[K[tail]])
        tail--;
      K[++tail] = j;
      dp[i][j] = dp[i - 1][K[head]] - sum[K[head]] + sum[j];
    }
  }
  printf("%lld\n", dp[m][n]);
  return 0;
}
