#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 9;
long long ara[MAXN];
long long tree[4 * MAXN], tree2[4 * MAXN];
vector<pair<pair<long long, long long>, long long> > op;
void propagate2(long long node, long long l, long long r) {
  long long mid = (l + r) >> 1;
  long long left_node = node * 2, left_l = l, left_r = mid;
  long long right_node = node * 2 + 1, right_l = mid + 1, right_r = r;
  tree2[left_node] += tree2[node];
  tree2[right_node] += tree2[node];
  tree2[node] = 0;
  return;
}
void propagate(long long node, long long l, long long r) {
  long long mid = (l + r) >> 1;
  long long left_node = node * 2, left_l = l, left_r = mid;
  long long right_node = node * 2 + 1, right_l = mid + 1, right_r = r;
  tree[left_node] += tree[node];
  tree[right_node] += tree[node];
  tree[node] = 0;
  return;
}
void update_tree2(long long node, long long l, long long r, long long x,
                  long long y) {
  if (l > y || r < x) return;
  if (l >= x && r <= y) {
    tree2[node]++;
    return;
  }
  if (tree2[node]) propagate2(node, l, r);
  long long mid = (l + r) >> 1;
  update_tree2(node * 2, l, mid, x, y);
  update_tree2(node * 2 + 1, mid + 1, r, x, y);
}
void update_tree1(long long node, long long l, long long r, long long x,
                  long long y, long long val) {
  if (l > y || r < x) return;
  if (l >= x && r <= y) {
    tree[node] += val;
    return;
  }
  if (tree[node]) propagate(node, l, r);
  long long mid = (l + r) >> 1;
  update_tree1(node * 2, l, mid, x, y, val);
  update_tree1(node * 2 + 1, mid + 1, r, x, y, val);
}
long long query_tree2(long long node, long long l, long long r, long long x,
                      long long y) {
  if (l > y || r < x) return 0;
  if (l >= x && r <= y) return tree2[node];
  if (tree2[node]) propagate2(node, l, r);
  long long mid = (l + r) >> 1;
  long long ret1 = query_tree2(node * 2, l, mid, x, y);
  long long ret2 = query_tree2(node * 2 + 1, mid + 1, r, x, y);
  return ret1 + ret2;
}
long long query_tree1(long long node, long long l, long long r, long long x,
                      long long y) {
  if (l > y || r < x) return 0;
  if (l >= x && r <= y) return tree[node];
  if (tree[node]) propagate(node, l, r);
  long long mid = (l + r) >> 1;
  long long ret1 = query_tree1(node * 2, l, mid, x, y);
  long long ret2 = query_tree1(node * 2 + 1, mid + 1, r, x, y);
  return ret1 + ret2;
}
void init(long long node, long long l, long long r) {
  if (l == r) {
    tree[node] = ara[l];
    return;
  }
  long long mid = (l + r) >> 1;
  init(node * 2, l, mid);
  init(node * 2 + 1, mid + 1, r);
}
int main() {
  long long i, j, k, l, m, n, mx, ans, r, d, x, y;
  cin >> n >> m >> k;
  for (int i = (int)1; i <= (int)n; i++) {
    cin >> ara[i];
  }
  op.push_back(
      pair<pair<long long, long long>, long long>(pair<int, int>(0, 0), 0));
  for (int i = (int)1; i <= (int)m; i++) {
    cin >> l >> r >> d;
    op.push_back(pair<pair<long long, long long>, long long>(
        pair<long long, long long>(l, r), d));
  }
  memset(tree2, 0, sizeof(tree2));
  for (int i = (int)1; i <= (int)k; i++) {
    cin >> x >> y;
    update_tree2(1, 1, m, x, y);
  }
  memset(tree, 0, sizeof(tree));
  init(1, 1, n);
  for (i = 1; i <= m; i++) {
    k = query_tree2(1, 1, m, i, i);
    update_tree1(1, 1, n, op[i].first.first, op[i].first.second,
                 k * op[i].second);
  }
  for (int i = (int)1; i <= (int)n; i++) {
    ara[i] = query_tree1(1, 1, n, i, i);
  }
  for (int i = (int)1; i <= (int)n; i++) cout << ara[i] << " ";
  cout << endl;
  return 0;
}
