#include <bits/stdc++.h>
using namespace std;
int n, m, q;
long long arr[2][200000 + 1], rx[200000 + 1];
unordered_map<int, long long> edges[200000];
const int imin(const int &x, const int &y) { return min(x, y); }
const long long lmin(const long long &x, const long long &y) {
  return min(x, y);
}
const int iplus(const int &x, const int &y) { return x + y; }
const long long lplus(const long long &x, const long long &y) { return x + y; }
void icmp_min(int &oldx, const int &newx) { oldx = min(oldx, newx); }
void iassign_plus(int &oldx, const int &newx) { oldx = newx; }
void iaccu_plus(int &oldx, const int &newx) { oldx += newx; }
void laccu_plus(long long &oldx, const long long &newx) { oldx += newx; }
void icmp_mind(int &oldx, const int &newx, int l, int r) {
  oldx = min(oldx, newx);
}
void iassign_plusd(int &oldx, const int &newx, int l, int r) {
  oldx = newx * (r - l);
}
void iaccu_plusd(int &oldx, const int &newx, int l, int r) {
  oldx += newx * (r - l);
}
void laccu_plusd(long long &oldx, const long long &newx, int l, int r) {
  oldx += newx * (r - l);
}
void laccu_min(long long &oldx, const long long &newx) { oldx += newx; }
void laccu_mind(long long &oldx, const long long &newx, int l, int r) {
  oldx += newx;
}
template <typename T>
struct SEG {
  typedef const T (*SEG_OP)(const T &, const T &);
  typedef void (*SEG_UPL)(T &, const T &);
  typedef void (*SEG_UPD)(T &, const T &, int l, int r);
  int size, m;
  T *data, *lazy, def, ldef;
  SEG_OP op;
  SEG_UPL upl;
  SEG_UPD upd;
  SEG(T *a, int n, typename SEG::SEG_OP op, typename SEG::SEG_UPL upl,
      typename SEG::SEG_UPD upd, const T &def, const T &ldef) {
    for (m = 1; m < n; m <<= 1)
      ;
    size = n, this->op = op, this->upl = upl, this->upd = upd;
    this->def = def, this->ldef = ldef;
    data = (T *)malloc(2 * m * sizeof(T));
    lazy = (T *)malloc(2 * m * sizeof(T));
    for (int i = 0; i < m + m; i++) lazy[i] = ldef;
    create(a, n, 1);
  }
  ~SEG() { free(data), free(lazy); }
  void create(T *a, int n, int i) {
    if (n == 1)
      data[i] = *a;
    else {
      int mid = n >> 1;
      create(a, mid, i + i), create(a + mid, n - mid, i + i + 1);
      data[i] = op(data[i + i], data[i + i + 1]);
    }
  }
  void push_lazy(int start, int end, int mid, int i) {
    if (lazy[i] != ldef) {
      upl(lazy[i + i], lazy[i]), upl(lazy[i + i + 1], lazy[i]);
      upd(data[i + i], lazy[i], start, mid),
          upd(data[i + i + 1], lazy[i], mid, end);
      lazy[i] = ldef;
    }
  }
  void update(int l, int r, const T &val, int start = -1, int end = -1,
              int i = 1) {
    if (i == 1) start = 0, end = size;
    if (r <= start || l >= end)
      ;
    else if (l <= start && r >= end)
      upl(lazy[i], val), upd(data[i], val, start, end);
    else {
      int mid = (start + end) >> 1;
      push_lazy(start, end, mid, i);
      update(l, r, val, start, mid, i + i);
      update(l, r, val, mid, end, i + i + 1);
      data[i] = op(data[i + i], data[i + i + 1]);
    }
  }
  const T query(int l, int r, int start = -1, int end = -1, int i = 1) {
    if (i == 1) start = 0, end = size;
    if (r <= start || l >= end)
      return def;
    else if (l <= start && r >= end)
      return data[i];
    else {
      int mid = (start + end) >> 1;
      push_lazy(start, end, mid, i);
      return op(query(l, r, start, mid, i + i),
                query(l, r, mid, end, i + i + 1));
    }
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> q;
  for (int i = 1; i < n; i++) cin >> arr[0][i] >> arr[1][i];
  int x, y, z;
  for (int i = 0; i < m; i++) {
    cin >> x >> y >> z, x--, y--;
    if (edges[x].count(y) != 0)
      edges[x][y] += z;
    else
      edges[x][y] = z;
  }
  SEG<long long> seg(arr[1], n, &lmin, &laccu_min, &laccu_mind,
                     (1000000000LL * 1000000000LL), 0);
  for (int i = 0; i < n; i++) {
    for (auto &p : edges[i]) seg.update(0, p.first + 1, p.second);
    rx[i + 1] = arr[0][i + 1] + seg.query(0, n);
  }
  SEG<long long> seg2(rx + 1, n, &lmin, &laccu_min, &laccu_mind,
                      (1000000000LL * 1000000000LL), 0);
  cout << seg2.query(0, n) << endl;
  for (int i = 0; i < q; i++) {
    cin >> x >> z;
    seg2.update(x - 1, x, z - arr[0][x]);
    cout << seg2.query(0, n) << endl;
    arr[0][x] = z;
  }
  return 0;
}
