#include <bits/stdc++.h>
using namespace std;
struct node {
  long long l, r, c;
} op[100005];
long long sum[100005 << 2], col[100005 << 2], a[100005];
int n, m, k;
void PushDown(long long len, int now) {
  if (!col[now]) return;
  col[now << 1] += col[now];
  col[(now << 1) | 1] += col[now];
  sum[now << 1] += col[now] * (len - (len >> 1));
  sum[(now << 1) | 1] += col[now] * (len >> 1);
  col[now] = 0;
  return;
}
void update(int L, int R, long long c, int l, int r, int now) {
  if (L <= l && R >= r) {
    sum[now] += (r - l + 1) * c;
    col[now] += c;
    return;
  }
  int mid = (l + r) / 2;
  PushDown(r - l + 1, now);
  if (L <= mid) update(L, R, c, l, mid, now << 1);
  if (R > mid) update(L, R, c, mid + 1, r, (now << 1) | 1);
  sum[now] = sum[now << 1] + sum[(now << 1) | 1];
  return;
}
long long query(int L, int R, int l, int r, int now) {
  long long ans = 0;
  if (L <= l && R >= r) return sum[now];
  int mid = (l + r) / 2;
  PushDown(r - l + 1, now);
  if (L <= mid) ans += query(L, R, l, mid, now << 1);
  if (R > mid) ans += query(L, R, mid + 1, r, (now << 1) | 1);
  return ans;
}
int main() {
  int i;
  while (~scanf("%d%d%d", &n, &m, &k)) {
    memset(sum, 0, sizeof(sum));
    memset(col, 0, sizeof(col));
    for (i = 1; i <= n; i++) scanf("%I64d", &a[i]);
    for (i = 1; i <= m; i++)
      scanf("%I64d%I64d%I64d", &op[i].l, &op[i].r, &op[i].c);
    for (i = 1; i <= k; i++) {
      int x, y;
      scanf("%d%d", &x, &y);
      update(x, y, 1, 1, m, 1);
    }
    for (i = 1; i <= m; i++) {
      long long x;
      x = query(i, i, 1, m, 1);
      op[i].c *= x;
    }
    memset(sum, 0, sizeof(sum));
    memset(col, 0, sizeof(col));
    for (i = 1; i <= n; i++) update(i, i, a[i], 1, n, 1);
    for (i = 1; i <= m; i++) update(op[i].l, op[i].r, op[i].c, 1, n, 1);
    for (i = 1; i <= n; i++) printf("%I64d ", query(i, i, 1, n, 1));
    printf("\n");
  }
  return 0;
}
