#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const long long ooo = 9223372036854775807ll;
const int _cnt = 1000 * 1000 + 7;
const int _p = 1000 * 1000 * 1000 + 7;
const int N = 1000105;
const double PI = acos(-1.0);
const double eps = 1e-6;
int o(int x) { return x % _p; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
void file_put() {
  freopen("filename.in", "r", stdin);
  freopen("filename.out", "w", stdout);
}
struct Seg_T {
  int n, L, R;
  long long s[4 * N], lazy[4 * N], *a, v;
  void push_up(int rt) { s[rt] = min(s[rt << 1], s[rt << 1 | 1]); }
  void push_down(int rt, int m) {
    if (!lazy[rt]) return;
    lazy[rt << 1] += lazy[rt];
    lazy[rt << 1 | 1] += lazy[rt];
    s[rt << 1] += lazy[rt];
    s[rt << 1 | 1] += lazy[rt];
    lazy[rt] = 0;
  }
  void B(int l, int r, int rt) {
    lazy[rt] = 0;
    if (l == r) {
      s[rt] = a[l];
      return;
    }
    int mid = (l + r) >> 1;
    B(l, mid, rt << 1);
    B(mid + 1, r, rt << 1 | 1);
    push_up(rt);
  }
  void Init(int _n, long long _a[] = NULL) {
    n = _n;
    if (_a == NULL) {
      memset(s, 0, sizeof(s));
      memset(lazy, 0, sizeof(lazy));
      return;
    }
    a = _a;
    B(1, n, 1);
  }
  void U(int l, int r, int rt) {
    if (L <= l && r <= R) {
      lazy[rt] += v;
      s[rt] += v;
      return;
    }
    push_down(rt, r - l + 1);
    int mid = (l + r) >> 1;
    if (L <= mid) U(l, mid, rt << 1);
    if (R > mid) U(mid + 1, r, rt << 1 | 1);
    push_up(rt);
  }
  long long Q(int l, int r, int rt) {
    if (L <= l && r <= R) return s[rt];
    push_down(rt, r - l + 1);
    int mid = (l + r) >> 1;
    long long ret = 0;
    if (L <= mid) ret = min(ret, Q(l, mid, rt << 1));
    if (R > mid) ret = min(ret, Q(mid + 1, r, rt << 1 | 1));
    push_up(rt);
    return ret;
  }
  void Update(int _L, int _R, long long _v) {
    L = _L, R = _R, v = _v;
    U(1, n, 1);
  }
  long long Query(int _L, int _R) {
    L = _L, R = _R;
    return Q(1, n, 1);
  }
};
int n, m, q, a[N], head[N], nxt[N], e[N], w[N], x, y, z, tot = 0, v;
long long b[N];
Seg_T T;
void I(int x, int y, int z) {
  e[++tot] = y, w[tot] = z, nxt[tot] = head[x], head[x] = tot;
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = (1); i <= (n - 1); ++i) scanf("%d%I64d", &a[i], &b[i + 1]);
  T.Init(n, b);
  for (int i = (1); i <= (m); ++i) scanf("%d%d%d", &x, &y, &z), I(x, y, z);
  for (int i = (1); i <= (n); ++i) {
    for (int j = head[i]; j; j = nxt[j]) T.Update(1, e[j], w[j]);
    b[i] = a[i] + T.Query(1, n);
  }
  T.Init(n, b);
  printf("%I64d\n", T.Query(1, n));
  while (q--) {
    scanf("%d%d", &x, &v);
    T.Update(x, x, (long long)v - a[x]);
    a[x] = v;
    printf("%I64d\n", T.Query(1, n));
  }
  return 0;
}
