#include <iostream>
#include <math.h>
#include <vector>
#include <utility>
 
using namespace std;
 
bool DFSUtil(int, vector<bool>&, vector<bool> &);
vector<pair<int, long long>> g[1234567];
long long node[1234567] = {0};
int R, C;
long long minR, minC;
 
 
int main(){
  cin >> R >> C;
 
  for(int i = 0; i < C + R; i++){
    g[i].clear();
  }
 
  int N;
  cin >> N;  
  for(int i = 0; i < N; i++){
    int r, c;
    long long a;
    cin >> r >> c >> a;
    r--; c--;
    g[r].push_back(make_pair( c + R, a));
    g[c + R].push_back(make_pair(r, a));
  }
 
  vector<bool> visited(R + C, false);
  vector<bool> was(R + C, false);
  
  for(int i = 0; i < R + C; i++){
      was[i] = true;
      minR = 1000000000;
      minC = 1000000000;

      if(!DFSUtil(i, visited, was)){
        cout << "No";
        return 0;
      }
  }
  cout << "Yes";
}
 
bool DFSUtil(int v, vector<bool> &visited, vector<bool> &was){
  if(visited[v]) return true;
  visited[v] = true;
  for(int i = 0; i < g[v].size(); i++){
    int w = g[v][i].first;
    long long a = g[v][i].second;
    if(was[v] && was[w]){
      if(node[v] + node[w] != a){
        return false;
      }
      continue;
    }
    node[w] = a - node[v];
    was[w] = true;
 
    if(v < R) minR = minR >node[v] ? node[v] : minR;
    if(v >= R) minC = minC>node[v] ? node[v] : minC;
    if(w < R) minR = minR >node[w] ? node[w] : minR;
    if(w >= R) minC = minC>node[w] ? node[w] : minC;
 
    if(minR + minC < 0) return false;
    if(!visited[w]){
      if(!DFSUtil(w, visited, was)) return false;
    }
  }
  return true;
}