#include <iostream>
#include <vector>
using namespace std;

#define INT_MAX 2000000000

typedef struct node {
  typedef struct edge {
    node *next;
    int heavy;
  } edge;
  vector<edge> edges;
  long int val;
  bool checked;
  int ax;
} node;

long int xmin;
long int ymin;

bool check(node *v,node *bef){
  v->checked = true;
  vector<node::edge>::iterator it;
  for(it = v->edges.begin(); it != v->edges.end(); ++it){
    if((*it).next != bef){
      if((*it).next->checked){
        if(v->val + (*it).next->val != (*it).heavy){
          return false;
        }
      }else{
        (*it).next->val = (*it).heavy - v->val;
        if((*it).next->ax == 0){
          xmin = min(xmin, (*it).next->val);
        }else{
          ymin = min(ymin, (*it).next->val);
        }
        if(!check((*it).next, v)){
          return false;
        }
      }
    }
  }
  return true;
}

int main(int argc, char *argv[]){
  int R, C;
  int N;
  cin >> R >> C;
  cin >> N;
  node x[R];
  node y[C];
  int i;
  for(i=0; i<R; ++i){
    x[i].checked = false;
    x[i].ax = 0;
  }
  for(i=0; i<C; ++i){
    y[i].checked = false;
    y[i].ax = 1;
  }
  int r, c, a;
  for(i=0; i<N; ++i){
    cin >> r >> c >> a;
    
    node::edge e1;
    e1.next = &y[c-1];
    e1.heavy = a;
    x[r-1].edges.push_back(e1);
    
    node::edge e2;
    e2.next = &x[r-1];
    e2.heavy = a;
    y[c-1].edges.push_back(e2);
  }
  for(i=0; i<R; ++i){
    if(!x[i].checked){
      if(x[i].edges.size() > 0){
        x[i].val = 0;
        xmin = 0;
        ymin = INT_MAX;
        if(check(&x[i], NULL)){
          if(xmin + ymin < 0){
            cout << "No" << endl;
            return 0;
          }
        }else{
          cout << "No" << endl;
          return 0;
        }
      }
    }
  }
  cout << "Yes" << endl;
  return 0;
}