#include <bits/stdc++.h>
using namespace std;
long long tree[100100];
long long tree1[100100];
const long long maxval = 100015;
long long f_to(long long idx) {
  long long sum = 0;
  while (idx > 0) {
    sum += tree[idx];
    idx -= (idx & -idx);
  }
  return sum;
}
long long f_to1(long long idx) {
  long long sum = 0;
  while (idx > 0) {
    sum += tree1[idx];
    idx -= (idx & -idx);
  }
  return sum;
}
void up(long long idx, long long val) {
  while (idx <= maxval) {
    tree[idx] += val;
    idx += (idx & -idx);
  }
}
void up1(long long idx, long long val) {
  while (idx <= maxval) {
    tree1[idx] += val;
    idx += (idx & -idx);
  }
}
long long Y[100008];
struct PO {
  long long r, l, d;
};
PO A[200000];
int main() {
  long long n, m, k;
  cin >> n >> m >> k;
  memset(tree1, 0, sizeof(tree1));
  memset(tree, 0, sizeof(tree));
  for (long long i = 1; i <= n; i++) scanf("%lld", &Y[i]);
  for (long long i = 1; i <= m; i++) {
    long long l, r, d;
    scanf("%lld %lld %lld", &l, &r, &d);
    A[i].d = d;
    A[i].r = r;
    A[i].l = l;
  }
  for (long long i = 0; i < k; i++) {
    long long l, r;
    scanf("%lld %lld", &l, &r);
    up1(l, 1);
    up1(r + 1, -1);
  }
  for (long long i = 1; i <= m; i++) {
    up(A[i].l, f_to1(i) * A[i].d);
    up(A[i].r + 1, -f_to1(i) * A[i].d);
  }
  for (long long i = 1; i <= n; i++) {
    long long d;
    d = Y[i] + f_to(i);
    printf("%lld ", d);
  }
  return 0;
}
