#include <bits/stdc++.h>
using namespace std;
inline long long mod(long long n, long long m) {
  long long ret = n % m;
  if (ret < 0) ret += m;
  return ret;
}
long long gcd(long long a, long long b) {
  return (b == 0LL ? a : gcd(b, a % b));
}
long long exp(long long a, long long b, long long m) {
  if (b == 0LL) return 1LL;
  if (b == 1LL) return mod(a, m);
  long long k = mod(exp(a, b / 2, m), m);
  if (b & 1LL) {
    return mod(a * mod(k * k, m), m);
  } else
    return mod(k * k, m);
}
const long long inf = 1e18;
struct LAZY {
  vector<long long> tree, lazy;
  long long n;
  LAZY() {}
  LAZY(long long _n) {
    n = _n;
    tree.resize(4 * n + 100, 0);
    lazy.resize(4 * n + 100, 0);
  }
  long long f(long long a, long long b) { return (a < b ? a : b); }
  void build(long long no, long long i, long long j) {
    if (i == j) {
      tree[no] = 0;
    } else {
      long long m = (i + j) / 2;
      long long l = 2 * no, r = 2 * no + 1;
      build(l, i, m);
      build(r, m + 1, j);
      tree[no] = f(tree[l], tree[r]);
    }
  }
  void propagate(long long no, long long i, long long j) {
    if (lazy[no] == 0) return;
    tree[no] += lazy[no];
    if (i != j) {
      lazy[2 * no] += lazy[no];
      lazy[2 * no + 1] += lazy[no];
    }
    lazy[no] = 0;
  }
  void update(long long no, long long i, long long j, long long a, long long b,
              long long v) {
    propagate(no, i, j);
    if (i > b || j < a || i > j) return;
    if (a <= i && j <= b) {
      tree[no] += v;
      if (i != j) {
        lazy[2 * no] += v;
        lazy[2 * no + 1] += v;
      }
      return;
    }
    long long m = (i + j) / 2;
    long long l = 2 * no, r = 2 * no + 1;
    update(l, i, m, a, b, v);
    update(r, m + 1, j, a, b, v);
    tree[no] = f(tree[l], tree[r]);
  }
  long long query(long long no, long long i, long long j, long long a,
                  long long b) {
    if (i > b || j < a || i > j) return inf;
    propagate(no, i, j);
    if (a <= i && j <= b) return tree[no];
    long long m = (i + j) / 2;
    long long l = 2 * no, r = 2 * no + 1;
    return f(query(l, i, m, a, b), query(r, m + 1, j, a, b));
  }
};
const long long N = 200100;
long long x[N], y[N];
long long cost[N];
vector<pair<long long, long long> > g[N];
struct node {
  long long x;
  node operator+(const node& rhs) const { return {min(x, rhs.x)}; }
};
template <class T>
struct ST {
  vector<T> st;
  long long n;
  T ini;
  ST(long long n, T ini) : st(2 * n, ini), n(n), ini(ini) {}
  void upd(long long pos, T val) {
    for (st[pos += n] = val; pos /= 2;) st[pos] = st[2 * pos] + st[2 * pos + 1];
  }
  T query(long long x, long long y) {
    T ra = ini, rb = ini;
    for (x += n, y += n + 1; x < y; x /= 2, y /= 2) {
      if (x & 1) ra = ra + st[x], x++;
      if (y & 1) --y, rb = st[y] + rb;
    }
    return ra + rb;
  }
};
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  long long n, m, q;
  cin >> n >> m >> q;
  for (long long i = 1; i <= n - 1; i++) {
    cin >> x[i] >> y[i];
  }
  for (long long i = 0; i < m; i++) {
    long long a, b, c;
    cin >> a >> b >> c;
    g[a].push_back(pair<long long, long long>(b, c));
  }
  LAZY seg(n);
  for (long long i = 1; i <= n; i++) {
    seg.update(1, 1, n, i, i, y[i - 1]);
  }
  for (long long i = 1; i <= n; i++) {
    for (auto it : g[i]) {
      seg.update(1, 1, n, 1, it.first, +it.second);
    }
    cost[i] = seg.query(1, 1, n, 1, n);
  }
  LAZY pre(n);
  for (long long i = 1; i <= n; i++) {
    pre.update(1, 1, n, i, i, cost[i]);
    pre.update(1, 1, n, i, i, x[i]);
  }
  cout << pre.query(1, 1, n, 1, n) << "\n";
  while (q--) {
    long long a, b;
    cin >> a >> b;
    pre.update(1, 1, n, a, a, -x[a]);
    x[a] = b;
    pre.update(1, 1, n, a, a, +x[a]);
    cout << pre.query(1, 1, n, 1, n) << "\n";
  }
}
