#include <algorithm>
#include <cstdio>
#include <limits>
#include <vector>

using namespace std;

typedef long long ll;

int r, c, n;
struct cell {
  int r, c, a;
};
vector<cell> R[1 << 20], C[1 << 20];
ll Rb[1 << 20], Cb[1 << 20];
void dfsR(int r, ll b);
void dfsC(int r, ll b);
ll lb, ub;
// SR[r]=ax+b
void dfsR(int r, ll b) {
  Rb[r] = b;
  vector<cell> ces;
  ces.swap(R[r]);
  for (auto& ce : ces) {
    if (!C[ce.c].empty()) {
      dfsC(ce.c, ce.a - b);
    } else if (Cb[ce.c] != ce.a - b) {
      ub = numeric_limits<ll>::min();
      lb = numeric_limits<ll>::max();
    }
  }
  //  printf("%d: x+%lld\n", r, b);
  lb = max(lb, -b);
}
// SC[r]=b-x
void dfsC(int c, ll b) {
  Cb[c] = b;
  vector<cell> ces;
  ces.swap(C[c]);
  for (auto& ce : ces) {
    if (!R[ce.r].empty()) {
      dfsR(ce.r, ce.a - b);
    } else if (Rb[ce.r] != ce.a - b) {
      ub = numeric_limits<ll>::min();
      lb = numeric_limits<ll>::max();
    }
  }
  //  printf("%d: %lld-x\n", c, b);
  ub = min(ub, b);
}

int main() {
  scanf("%d%d%d", &r, &c, &n);
  for (int i = 0; i < n; ++i) {
    int ri, ci, ai;
    scanf("%d%d%d", &ri, &ci, &ai);
    R[ri].push_back({ri, ci, ai});
    C[ci].push_back({ri, ci, ai});
  }
  for (int i = 1; i <= r; i++) {
    if (!R[i].empty()) {
      lb = numeric_limits<ll>::min();
      ub = numeric_limits<ll>::max();
      dfsR(i, 0);
      //      printf("=== %lld %lld\n", lb, ub);
      if (lb > ub) {
        printf("No\n");
        return 0;
      }
    }
  }
  printf("Yes\n");
}
