#include <bits/stdc++.h>
using namespace std;
void Get_Val(int &Ret) {
  Ret = 0;
  char ch;
  while (ch = getchar(), ch > '9' || ch < '0')
    ;
  do {
    (Ret *= 10) += ch - '0';
  } while (ch = getchar(), ch >= '0' && ch <= '9');
}
const int Max_NM(200050);
struct edge {
  edge(const int &_b, const int &_z) : b(_b), z(_z) {}
  int b, z;
};
int N, M, Q, A[Max_NM], B[Max_NM];
vector<edge> E[Max_NM];
long long int W[Max_NM];
map<long long int, int> Heap;
inline void insert(const long long int &v, const int &c) {
  if ((Heap[v] += c) == 0) Heap.erase(v);
}
inline long long int query() { return Heap.begin()->first; }
void init() {
  Get_Val(N), Get_Val(M), Get_Val(Q);
  for (int i = 1; i <= N - 1; ++i) Get_Val(A[i]), Get_Val(B[i]);
  for (int i = 1, a, b, z; i <= M; ++i)
    Get_Val(a), Get_Val(b), Get_Val(z), E[a].push_back(edge(b, z));
}
struct node {
  int l, r, mid;
  long long int Tag, Min;
};
node segt[Max_NM << 2];
inline void pushup(const int &cur) {
  (segt[cur].Min) = min(segt[(cur << 1)].Min, segt[((cur << 1) | 1)].Min);
}
inline void Add(const int &cur, const long long int &v) {
  (segt[cur].Tag) += v, (segt[cur].Min) += v;
}
inline void pushdown(const int &cur) {
  if ((segt[cur].Tag))
    Add((cur << 1), (segt[cur].Tag)), Add(((cur << 1) | 1), (segt[cur].Tag)),
        (segt[cur].Tag) = 0LL;
}
void build_tree(const int &cur, const int &l, const int &r) {
  (segt[cur].l) = l, (segt[cur].r) = r, (segt[cur].mid) = l + ((r - l) >> 1),
  (segt[cur].Tag) = 0LL;
  if (l == r) {
    (segt[cur].Min) = B[l];
    return;
  }
  build_tree((cur << 1), l, (segt[cur].mid)),
      build_tree(((cur << 1) | 1), (segt[cur].mid) + 1, r), pushup(cur);
}
void insert(const int &cur, const int &l, const int &r,
            const long long int &v) {
  if ((segt[cur].l) == l && (segt[cur].r) == r) {
    Add(cur, v);
    return;
  }
  pushdown(cur);
  if (r <= (segt[cur].mid))
    insert((cur << 1), l, r, v);
  else if (l > (segt[cur].mid))
    insert(((cur << 1) | 1), l, r, v);
  else
    insert((cur << 1), l, (segt[cur].mid), v),
        insert(((cur << 1) | 1), (segt[cur].mid) + 1, r, v);
  pushup(cur);
}
void prepare() {
  build_tree(1, 0, N - 1);
  for (int a = 1; a <= N - 1; ++a) {
    for (int i = 0; i != E[a].size(); ++i)
      insert(1, 0, E[a][i].b - 1, E[a][i].z);
    W[a] = segt[1].Min;
    insert(A[a] + W[a], +1);
  }
  for (int i = 0; i != E[N].size(); ++i) insert(1, 0, E[N][i].b - 1, E[N][i].z);
  insert(segt[1].Min, +1);
}
void work() {
  printf("%lld\n", query());
  int ai, wi;
  while (Q--) {
    Get_Val(ai), Get_Val(wi);
    insert(A[ai] + W[ai], -1);
    insert((A[ai] = wi) + W[ai], +1);
    printf("%I64d\n", query());
  }
}
int main() {
  init();
  prepare();
  work();
  return 0;
}
