#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, M = N << 2;
int n, m, Q;
long long a[N], b[N], c[N];
int tot, head[N], ver[N << 1], Next[N << 1], edge[N << 1];
inline void add(int x, int y, int z) {
  ver[++tot] = y;
  edge[tot] = z;
  Next[tot] = head[x];
  head[x] = tot;
}
namespace SegmentTree {
long long Min[M], tag[M];
inline void init(void) {
  memset(Min, 0, sizeof Min);
  memset(tag, 0, sizeof tag);
}
inline void pushup(int p) { Min[p] = min(Min[p << 1], Min[p << 1 | 1]); }
inline void pushdown(int p) {
  Min[p << 1] += tag[p];
  tag[p << 1] += tag[p];
  Min[p << 1 | 1] += tag[p];
  tag[p << 1 | 1] += tag[p];
  tag[p] = 0;
}
inline void build(int p, int l, int r) {
  if (l == r) {
    Min[p] = b[l];
    return;
  }
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
  pushup(p);
}
inline void change(int p, int l, int r, int L, int R, long long val) {
  if (L <= l && r <= R) {
    Min[p] += val;
    tag[p] += val;
    return;
  }
  if (tag[p]) pushdown(p);
  int mid = (l + r) >> 1;
  if (L <= mid) change(p << 1, l, mid, L, R, val);
  if (R > mid) change(p << 1 | 1, mid + 1, r, L, R, val);
  pushup(p);
}
}  // namespace SegmentTree
int main() {
  cin >> n >> m >> Q;
  for (int i = 1; i < n; i++) scanf("%lld%lld", &a[i], &b[i + 1]);
  SegmentTree::build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    add(x, y, z);
  }
  for (int x = 1; x <= n; x++) {
    for (int i = head[x]; i; i = Next[i]) {
      int y = ver[i], z = edge[i];
      SegmentTree::change(1, 1, n, 1, y, z);
    }
    c[x] = SegmentTree::Min[1];
  }
  for (int i = 1; i <= n; i++) b[i] = a[i] + c[i];
  SegmentTree::init();
  SegmentTree::build(1, 1, n);
  cout << SegmentTree::Min[1] << endl;
  while (Q--) {
    int x;
    long long y;
    scanf("%d%lld", &x, &y);
    SegmentTree::change(1, 1, n, x, x, y - a[x]);
    a[x] = y;
    printf("%lld\n", SegmentTree::Min[1]);
  }
  return 0;
}
