#include <bits/stdc++.h>
using namespace std;
template <typename T>
T min(T a, T b, T c) {
  return min(a, min(b, c));
}
template <typename T>
T max(T a, T b, T c) {
  return max(a, max(b, c));
}
vector<pair<long long, long long>> traverse = {
    {1, 0}, {0, 1}, {-1, 0}, {0, -1}};
void read(string &s) {
  s.clear();
  cin >> s;
}
template <typename T>
void read(vector<T> &arr, long long N) {
  arr.clear();
  arr.resize(N);
  for (long long i = 0; i < N; i++) cin >> arr[i];
}
template <typename T>
void read(vector<pair<T, T>> &arr, long long N) {
  arr.clear();
  arr.resize(N);
  for (long long i = 0; i < (long long)arr.size(); i++)
    cin >> arr[i].first >> arr[i].second;
}
template <typename T>
void read(vector<vector<T>> &arr, long long N, long long M) {
  arr.clear();
  arr.resize(N, vector<T>(M));
  for (long long i = 0; i < N; i++) {
    for (long long j = 0; j < M; j++) cin >> arr[i][j];
  }
}
template <typename T>
void print(vector<T> &arr) {
  for (auto it : arr) cout << it << ' ';
  cout << endl;
}
template <typename T>
void print(vector<pair<T, T>> &arr) {
  for (auto it : arr) cout << it.first << ' ' << it.second << endl;
}
template <typename T>
void print(vector<vector<T>> &arr) {
  for (auto it : arr) {
    for (auto ut : it) cout << ut << ' ';
    cout << endl;
  }
  cout << endl;
}
struct searchpair {
  vector<long long> A;
  void init(vector<pair<long long, long long>> &arr) {
    A.clear();
    for (long long i = 0; i < (long long)arr.size(); i++) {
      A.push_back(arr[i].first);
    }
  }
  long long _first(long long val) {
    auto it = lower_bound(A.begin(), A.end(), val);
    if (it == A.end()) return -1;
    return it - A.begin();
  }
};
struct uf {
  vector<long long> par, size;
  void init(long long N) {
    par.resize(N, -1);
    size.resize(N, 1);
  }
  long long root(long long a) {
    if (par[a] == -1) return a;
    return par[a] = root(par[a]);
  }
  void unite(long long a, long long b) {
    a = root(a);
    b = root(b);
    if (a == b) return;
    if (size[a] < size[b]) {
      par[a] = b;
      size[b] += size[a];
    } else {
      par[b] = a;
      size[a] += size[b];
    }
  }
  bool same(long long a, long long b) {
    if (root(a) == root(b)) return true;
    return false;
  }
};
bool lexi(string &s1, string &s2) {
  long long I = s1.size(), J = s2.size(), i = 0, j = 0;
  while (i < I and j < J) {
    if (s1[i] > s2[j]) return true;
    if (s1[i] < s2[j]) return false;
    i++;
    j++;
  }
  if (I > J) return true;
  return false;
}
static bool comp(pair<long long, long long> a, pair<long long, long long> b) {
  if (a.first < b.first) return true;
  if (a.first == b.first) {
    if (a.second < b.second) return true;
  }
  return false;
}
long long Max = 1e15, Min = -1e15;
long long N, M, K;
long long mod = 1e9;
vector<long long> arr, brr;
void solve() {
  cin >> N >> M >> K;
  read(arr, N);
  brr = arr;
  vector<long long> times(M);
  vector<vector<long long>> have(M, vector<long long>(3));
  for (long long i = 0; i < M; i++) {
    cin >> have[i][0] >> have[i][1] >> have[i][2];
    have[i][0]--;
    have[i][1]--;
  }
  for (long long i = 0; i < K; i++) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    times[a]++;
    if (b + 1 < M) times[b + 1]--;
  }
  for (long long i = 1; i < M; i++) times[i] += times[i - 1];
  for (long long i = 0; i < M; i++) {
    arr[have[i][0]] += times[i] * have[i][2];
    if (have[i][1] + 1 < N) arr[have[i][1] + 1] -= times[i] * have[i][2];
  }
  for (long long i = 1; i < N; i++) arr[i] += arr[i - 1];
  long long a = brr[0];
  for (long long i = 1; i < N; i++) {
    arr[i] -= a;
    a += brr[i];
  }
  print(arr);
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  bool test = 0;
  if (!test)
    solve();
  else {
    long long tt;
    cin >> tt;
    while (tt--) solve();
  }
  return 0;
}
