#include <bits/stdc++.h>
using namespace std;
struct segtree {
  int l, r;
  long long val, lz;
} t[1000006];
long long a[200005], b[200005];
int tot, nxt[200005], point[200005], had[200005];
long long val[200005];
inline void add(int x, int y, long long v) {
  tot++;
  nxt[tot] = had[x];
  point[tot] = y;
  val[tot] = v;
  had[x] = tot;
}
void build(int n, int l, int r, long long *b) {
  t[n].l = l;
  t[n].r = r;
  t[n].lz = 0;
  if (l == r) {
    t[n].val = b[l - 1];
    return;
  }
  int mid = (l + r) >> 1, ls = n << 1, rs = n << 1 | 1;
  build(ls, l, mid, b);
  build(rs, mid + 1, r, b);
  t[n].val = min(t[ls].val, t[rs].val);
}
inline void down(int x) {
  long long a = t[x].lz;
  int ls = x << 1, rs = x << 1 | 1;
  t[x].lz = 0;
  t[ls].lz += a;
  t[rs].lz += a;
  t[ls].val += a;
  t[rs].val += a;
}
void update(int n, int l, int r, long long x) {
  if (t[n].l > r || t[n].r < l) return;
  if (t[n].l >= l && t[n].r <= r) {
    t[n].val += x;
    t[n].lz += x;
    return;
  }
  down(n);
  update(n << 1, l, r, x);
  update(n << 1 | 1, l, r, x);
  t[n].val = min(t[n << 1].val, t[n << 1 | 1].val);
}
long long lx[200005];
int main() {
  int n, m, q;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i < n; i++) scanf("%I64d%I64d", &a[i], &b[i]);
  build(1, 1, n, b);
  for (int i = 1; i <= m; i++) {
    int x, y;
    long long z;
    scanf("%d%d%I64d", &x, &y, &z);
    add(x, y, z);
  }
  long long int ans = 1e18;
  for (int i = 1; i <= n; i++) {
    for (int j = had[i]; j; j = nxt[j]) update(1, 1, point[j], val[j]);
    lx[i] = a[i];
    a[i] = t[1].val + a[i];
    ans = min(a[i], ans);
  }
  puts("");
  build(1, 1, n, a + 1);
  printf("%I64d\n", ans);
  for (int i = 1; i <= q; i++) {
    int x;
    long long y;
    scanf("%d%I64d", &x, &y);
    update(1, x, x, y - lx[x]);
    lx[x] = y;
    printf("%I64d\n", t[1].val);
  }
  return 0;
}
