#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template<class T>
void debug(T itr1, T itr2) { auto now = itr1; while(now<itr2) { cout << *now << " "; now++; } cout << endl; }
#define repr(i,from,to) for (int i=(int)from; i<(int)to; i++)
#define rep(i,N) repr(i,0,N)
#define per(i,N) for (int i=(int)N-1; i>=0; i--)

const ll MOD = pow(10,9)+7;
const ll LLINF = pow(2,61)-1;
const int INF = pow(2,30)-1;
const int R_MAX = pow(10,5);

struct edge { int to; ll v; };
bool ok = true;
vector<ll> num(2*R_MAX, LLINF);
vector<vector<edge>> adj;
ll xmin = LLINF, ymin = LLINF;

void dfs(int n, ll v=0) {
  if (num[n]!=LLINF) {
    if (num[n]!=v) ok = false;
    return;
  }
  num[n] = v;
  if (n<R_MAX) xmin = min(xmin, v);
  else ymin = min(ymin,v);
  for (auto x: adj[n]) dfs(x.to, x.v-v);
  return;
}

int main() {
  int R, C; cin >> R >> C;
  int N; cin >> N;

  adj.resize(2*R_MAX);
  rep(i,N) {
    int r, c, a; cin >> r >> c >> a; r--; c--;
    adj[r].push_back({c+R_MAX,a});
    adj[c+R_MAX].push_back({r,a});
  }
  
  rep(i,R_MAX*2) {
    xmin = LLINF; ymin = LLINF;
    if (num[i]==LLINF) dfs(i);
    if (xmin+ymin<0) ok = false;
  }
  // rep(i,10) cout << num[i] << " "; cout << endl;
  // rep(i,10) cout << num[R_MAX+i] << " "; cout << endl;

  string result = ok ? "Yes" : "No";
  cout << result << endl;
  return 0;
}