#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
 
typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)
 
#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(ix,v.size())cout<<" "<<v[ix];cout<<endl
#define ALL(a) (a).begin(),(a).end()
 
#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))
 
// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD
 
// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x)<EPS)
#define EQ(a,b) (abs(a-b)<EPS)
typedef complex<Real> P;
 
const int INF = 2125252830;
 
int r,c,n;
pii ps[125252];
int val[125252];
struct pii_hash {
  size_t operator () (const pii &p) const {
    return hash<int>{}(p.first) ^ hash<int>{}(hash<int>{}(p.second));
  }
};
unordered_map<pii,int,pii_hash> rev;

int xmin[125252];
vi ys[125252];
vector<pii> g[125252];
ll dist[125252];
bool used[125252];

bool po[125252];
vi node;
int vere[125252];

bool check(){
  int a = node.size();
  REP(i,a)vere[node[i]] = i;
  REP(i,a)dist[i] = 0;
  REP(i,a)used[i] = false;
  dist[0] = 0;
  used[0] = true;
  queue<int> Q;
  Q.push(0);
  while(!Q.empty()){
    int p = Q.front(); Q.pop();
    int id = node[p];
    ll d = dist[p];
    REP(i,g[id].size()){
      int to = vere[g[id][i].first];
      ll cost = (ll)g[id][i].second;
      ll nd = d+cost;
      if(used[to]){
        if(dist[to]!=nd)return false;
      }else{
        dist[to] = nd;
        used[to] = true;
        Q.push(to);
      }
    }
  }
  // negative check
  ll sm = *min_element(dist,dist+a);
  REP(i,a){
    if(sm + (ll)xmin[node[i]] < 0){
      return false;
    }
    if(i==a-1)break;
    sm -= dist[i+1]-dist[i];
  }
  return true;
}
 
bool valid(int n){
  REP(i,125252)po[i]=false;
  REP(i,n){
    if(po[i])continue;
    node.clear();
    po[i] = true;
    node.push_back(i);
    queue<int> Q;
    Q.push(i);
    while(!Q.empty()){
      int p = Q.front(); Q.pop();
      REP(j,g[p].size()){
        int to = g[p][j].first;
        if(po[to])continue;
        po[to] = true;
        node.push_back(to);
        Q.push(to);
      }
    }
    sort(ALL(node));
    if(!check())return false;
  }
  return true;
}

int Mx[125252],My[125252];
 
int main(){
  scanf("%d%d%d",&r,&c,&n);
  set<int> Sx,Sy;
  REP(i,n){
    int x,y,a;
    scanf("%d%d%d",&x,&y,&a);
    ps[i] = pii(x,y);
    val[i] = a;
    Sx.insert(x);
    Sy.insert(y);
  }
  int it = 0;
  for(const int& x:Sx){
    Mx[x] = it++;
  }
  r = it;
  it = 0;
  for(const int& y:Sy){
    My[y] = it++;
  }
  c = it;

  REP(i,125252)xmin[i] = INF;
  REP(i,n){
    int x,y;
    x=Mx[ps[i].first];
    y=My[ps[i].second];
    CHMIN(xmin[y],val[i]);
    ys[x].push_back(y);
    ps[i] = pii(x,y);
    rev[ps[i]] = i;
  }
  // graph
  REP(i,r){
    sort(ALL(ys[i]));
    vi &vec = ys[i];
    REP(j,vec.size()-1){
      int s,t;
      s = vec[j];
      t = vec[j+1];
      int sid = rev[pii(i,s)];
      int tid = rev[pii(i,t)];
      int sa = val[tid]-val[sid];
      g[s].push_back(pii(t,sa));
      g[t].push_back(pii(s,-sa));
    }
  }
  if(!valid(r)){
    puts("No");
    return 0;
  }
  // ok
  puts("Yes");
  return 0;
}


Measured memory_bytes: 27300