#include <bits/stdc++.h>
using namespace std;
long long cas = 1;
long long dxx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
long long dyy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
long long dx[] = {-1, 0, 0, 1};
long long dy[] = {0, -1, 1, 0};
struct info {
  long long mi, pro, cnt;
} tre[100005 * 3];
long long ai[100005], ans = 0;
void update(long long n, long long be, long long en, long long i, long long j,
            long long v) {
  if (i > en || j < be) return;
  if (be >= i && en <= j) {
    tre[n].cnt++;
    tre[n].pro += v + (be - i);
    return;
  }
  long long m, l, r;
  m = (be + en) / 2;
  l = n * 2;
  r = l + 1;
  if (tre[n].pro >= 1) {
    tre[l].pro += tre[n].pro;
    tre[l].cnt += tre[n].cnt;
    tre[r].pro += tre[n].pro + tre[n].cnt * ((m + 1 - be));
    tre[r].cnt += tre[n].cnt;
    tre[n].pro = 0;
    tre[n].cnt = 0;
  }
  update(l, be, m, i, j, v);
  update(r, m + 1, en, i, j, v);
}
long long query(long long n, long long be, long long en, long long i) {
  if (ans != -1) return ans;
  if (be == i && en == i) {
    tre[n].cnt++;
    ans = tre[n].pro;
    return tre[n].pro;
  }
  long long m, l, r;
  m = (be + en) / 2;
  l = n * 2;
  r = l + 1;
  long long a, b;
  if (tre[n].pro >= 1) {
    tre[l].pro += tre[n].pro;
    tre[l].cnt += tre[n].cnt;
    tre[r].pro += tre[n].pro + tre[n].cnt * ((m - be + 1));
    tre[r].cnt += tre[n].cnt;
    tre[n].pro = 0;
    tre[n].cnt = 0;
  }
  if (be <= i && m >= i) return query(l, be, m, i);
  return query(r, m + 1, en, i);
}
int main() {
  memset(tre, 0, sizeof(tre));
  long long n, m, q, i, k, j, v;
  cin >> n >> m >> q;
  for (k = 0; k < m; k++) {
    cin >> i >> j >> v;
    update(1, 1, n, i, j, v);
  }
  long long a1 = 0;
  for (i = 1; i <= q; i++) {
    cin >> k;
    ans = -1;
    ans = query(1, 1, n, k);
    a1 += ans;
  }
  cout << a1 << endl;
}
