#include <bits/stdc++.h>
using namespace std;
long long tree[400100];
long long lazy[400100] = {0};
long long arr[400100];
vector<pair<pair<long long, long long>, long long> > ops;
void update(long long si, long long ss, long long se, long long us,
            long long ue, long long diff) {
  if (lazy[si] != 0) {
    tree[si] += (se - ss + 1) * lazy[si];
    if (ss != se) {
      lazy[si * 2 + 1] += lazy[si];
      lazy[si * 2 + 2] += lazy[si];
    }
    lazy[si] = 0;
  }
  if (ss > se || ss > ue || se < us) return;
  if (ss >= us && se <= ue) {
    tree[si] += diff;
    if (ss != se) {
      lazy[si * 2 + 1] += diff;
      lazy[si * 2 + 2] += diff;
    }
    lazy[si] = 0;
    return;
  }
  long long mid = (ss + se) / 2;
  update(si * 2 + 1, ss, mid, us, ue, diff);
  update(si * 2 + 2, mid + 1, se, us, ue, diff);
  tree[si] = tree[si * 2 + 1] + tree[si * 2 + 2];
}
long long query1(long long ss, long long se, long long qs, long long qe,
                 long long si) {
  if (lazy[si] != 0) {
    tree[si] += (se - ss + 1) * lazy[si];
    if (ss != se) {
      lazy[si * 2 + 1] += lazy[si];
      lazy[si * 2 + 2] += lazy[si];
    }
    lazy[si] = 0;
  }
  if (ss > se || ss > qe || se < qs) return 0;
  if (ss == se) {
    arr[ss] = tree[si];
    return tree[si];
  }
  long long mid = (ss + se) / 2;
  return query1(ss, mid, qs, qe, 2 * si + 1) +
         query1(mid + 1, se, qs, qe, 2 * si + 2);
}
long long query(long long ss, long long se, long long qs, long long qe,
                long long si) {
  if (lazy[si] != 0) {
    tree[si] += (se - ss + 1) * lazy[si];
    if (ss != se) {
      lazy[si * 2 + 1] += lazy[si];
      lazy[si * 2 + 2] += lazy[si];
    }
    lazy[si] = 0;
  }
  if (ss > se || ss > qe || se < qs) return 0;
  if (ss == se) {
    ops[ss].second *= tree[si];
    return tree[si];
  }
  long long mid = (ss + se) / 2;
  return query(ss, mid, qs, qe, 2 * si + 1) +
         query(mid + 1, se, qs, qe, 2 * si + 2);
}
void build(long long ss, long long se, long long si) {
  if (ss > se) return;
  if (ss == se) {
    tree[si] = 0;
    return;
  }
  long long mid = (ss + se) / 2;
  build(ss, mid, si * 2 + 1);
  build(mid + 1, se, si * 2 + 2);
  tree[si] = tree[si * 2 + 1] + tree[si * 2 + 2];
}
void build1(long long ss, long long se, long long si) {
  if (ss > se) return;
  if (ss == se) {
    tree[si] = arr[ss];
    return;
  }
  long long mid = (ss + se) / 2;
  build1(ss, mid, si * 2 + 1);
  build1(mid + 1, se, si * 2 + 2);
  tree[si] = tree[si * 2 + 1] + tree[si * 2 + 2];
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m, k, x, y, z;
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) cin >> arr[i];
  for (int i = 0; i < m; i++)
    cin >> x >> y >> z, ops.push_back({{x - 1, y - 1}, z});
  build(0, m - 1, 0);
  while (k--) {
    cin >> x >> y;
    x--;
    y--;
    update(0, 0, m - 1, x, y, 1);
  }
  query(0, m - 1, 0, m - 1, 0);
  memset(tree, 0, sizeof tree);
  memset(lazy, 0, sizeof lazy);
  build1(0, n - 1, 0);
  for (int i = 0; i < m; i++)
    if (ops[i].second)
      update(0, 0, n - 1, ops[i].first.first, ops[i].first.second,
             ops[i].second);
  query1(0, n - 1, 0, n - 1, 0);
  for (int i = 0; i < n; i++) cout << arr[i] << " ";
  return 0;
}
