#include <bits/stdc++.h>
using namespace std;
int tikus, lubang, postikus[5005], now = 1, tadi = 0;
pair<int, int> poslubang[5005], tampungkiri[5005], tampungkanan[5005];
long long dp[5][5005], pre[5005];
int jarak(int a, int b) { return abs(a - b); }
void isidp(int jenis, int l, int r, int optl, int optr) {
  if (l > r) return;
  long long biaya = 0;
  int mid = (l + r) >> 1;
  int bataskiri = max(optl, mid - poslubang[jenis].second + 1);
  dp[now][mid] = dp[tadi][mid];
  int opt = mid + 1;
  for (int i = min(mid, optr); i >= bataskiri; i--) {
    biaya = pre[mid] - pre[i - 1];
    if (biaya + dp[tadi][i - 1] < dp[now][mid]) {
      dp[now][mid] = min(dp[now][mid], biaya + dp[tadi][i - 1]);
      opt = i;
    }
  }
  isidp(jenis, l, mid - 1, optl, opt);
  isidp(jenis, mid + 1, r, opt, optr);
}
void merge(int jenis, int kiri, int kanan) {
  int mid = (kiri + kanan) >> 1, nkiri = 0, nkanan = 0;
  for (int i = kiri; i <= mid; i++) {
    if (jenis == 0)
      tampungkiri[nkiri++] = make_pair(postikus[i], i);
    else
      tampungkiri[nkiri++] = poslubang[i];
  }
  for (int i = mid + 1; i <= kanan; i++) {
    if (jenis == 0)
      tampungkanan[nkanan++] = make_pair(postikus[i], i);
    else
      tampungkanan[nkanan++] = poslubang[i];
  }
  tampungkanan[nkanan].first = tampungkiri[nkiri].first = 1000000001;
  int j = 0, k = 0;
  for (int i = kiri; i <= kanan; i++) {
    if (tampungkiri[j].first < tampungkanan[k].first) {
      if (jenis == 0)
        postikus[i] = tampungkiri[j].first;
      else
        poslubang[i] = tampungkiri[j];
      j++;
    } else {
      if (jenis == 0)
        postikus[i] = tampungkanan[k].first;
      else
        poslubang[i] = tampungkanan[k];
      k++;
    }
  }
}
void sorting(int jenis, int kiri, int kanan) {
  if (kiri == kanan) return;
  int mid = (kiri + kanan) >> 1;
  sorting(jenis, kiri, mid);
  sorting(jenis, mid + 1, kanan);
  merge(jenis, kiri, kanan);
}
void hitung_pre(int indekslubang) {
  pre[0] = 0;
  for (int i = 1; i <= tikus; i++)
    pre[i] = pre[i - 1] + jarak(postikus[i], poslubang[indekslubang].first);
}
int main() {
  scanf("%d%d", &tikus, &lubang);
  for (int i = 1; i <= tikus; i++) scanf("%d", &postikus[i]);
  for (int i = 1; i <= lubang; i++) {
    scanf("%d%d", &poslubang[i].first, &poslubang[i].second);
  }
  sorting(0, 1, tikus);
  sorting(1, 1, lubang);
  dp[now][0] = 0;
  for (int i = 1; i <= tikus; i++) {
    if (i <= poslubang[1].second)
      dp[now][i] = jarak(postikus[i], poslubang[1].first) + dp[now][i - 1];
    else
      dp[now][i] = 1000000000000000LL;
  }
  swap(now, tadi);
  for (int ulang = 2; ulang <= lubang; ulang++) {
    hitung_pre(ulang);
    dp[now][0] = 0;
    isidp(ulang, 1, tikus, 1, tikus);
    swap(now, tadi);
  }
  if (dp[tadi][tikus] == 1000000000000000LL)
    printf("-1\n");
  else
    printf("%lld\n", dp[tadi][tikus]);
}
