#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 10;
long long gi() {
  long long x = 0, o = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
struct heap {
  priority_queue<long long, vector<long long>, greater<long long> > q, d;
  void push(long long x) { q.push(x); }
  void del(long long x) { d.push(x); }
  long long top() {
    while (!d.empty() && q.top() == d.top()) q.pop(), d.pop();
    return q.top();
  }
} Q;
struct node {
  long long minn, add;
} t[N << 2];
void modify(long long o, long long v) {
  t[o].add += v;
  t[o].minn += v;
}
void pushdown(long long o) {
  modify(o << 1, t[o].add);
  modify(o << 1 | 1, t[o].add);
  t[o].add = 0;
}
void build(long long o, long long l, long long r, long long *arr) {
  t[o].add = 0;
  if (l == r) {
    t[o].minn = arr[l];
    return;
  }
  long long mid = (l + r) >> 1;
  build(o << 1, l, mid, arr);
  build(o << 1 | 1, mid + 1, r, arr);
  t[o].minn = min(t[o << 1].minn, t[o << 1 | 1].minn);
}
void update(long long o, long long l, long long r, long long ul, long long ur,
            long long v) {
  if (l == ul && r == ur) return modify(o, v);
  if (t[o].add) pushdown(o);
  long long mid = (l + r) >> 1;
  if (ur <= mid)
    update(o << 1, l, mid, ul, ur, v);
  else if (ul > mid)
    update(o << 1 | 1, mid + 1, r, ul, ur, v);
  else
    update(o << 1, l, mid, ul, mid, v),
        update(o << 1 | 1, mid + 1, r, mid + 1, ur, v);
  t[o].minn = min(t[o << 1].minn, t[o << 1 | 1].minn);
}
long long query(long long o, long long l, long long r, long long ql,
                long long qr) {
  if (l == ql && r == qr) return t[o].minn;
  if (t[o].add) pushdown(o);
  long long mid = (l + r) >> 1;
  if (qr <= mid)
    return query(o << 1, l, mid, ql, qr);
  else if (ql > mid)
    return query(o << 1 | 1, mid + 1, r, ql, qr);
  else
    return min(query(o << 1, l, mid, ql, mid),
               query(o << 1 | 1, mid + 1, r, mid + 1, qr));
}
struct edge {
  long long to, w, nxt;
} e[N << 1];
long long tot = 0, h[N];
void add(long long u, long long v, long long w) {
  e[++tot] = (edge){v, w, h[u]};
  h[u] = tot;
}
long long n, m, q, a[N], b[N], f[N];
signed main() {
  cin >> n >> m >> q;
  for (long long i = 1; i < n; i++) a[i] = gi(), b[i + 1] = gi();
  for (long long i = 1, u, v, w; i <= m; i++)
    u = gi(), v = gi(), w = gi(), add(u, v, w);
  build(1, 1, n, b);
  for (long long i = 1; i <= n; i++) {
    for (long long j = h[i]; j; j = e[j].nxt)
      update(1, 1, n, 1, e[j].to, e[j].w);
    f[i] = t[1].minn;
    Q.push(f[i] + a[i]);
  }
  printf("%lld\n", Q.top());
  while (q--) {
    long long v = gi(), w = gi();
    Q.del(f[v] + a[v]);
    a[v] = w;
    Q.push(f[v] + a[v]);
    printf("%lld\n", Q.top());
  }
  return 0;
}
