#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;
 
const int MAX = 1<<17;
int N;
ll seg[2*MAX];
ll sum[2*MAX];
void init(int n,ll *dist){
  N = 1;
  while(N<n)N<<=1;
  REP(i,N)seg[i+N-1]=0;
  REP(i,n)seg[i+N-1]=dist[i];
  FORR(i,0,N-1)seg[i]=min(seg[2*i+1],seg[2*i+2]);
  REP(i,2*N)sum[i]=0;
}
void add(int l,int r,ll v,int a,int b,int k){
  if(r<=a || b<=l)return;
  if(l<=a && b<=r){
    sum[k] += v;
    seg[k] += v;
  }else{
    int m = (a+b)/2;
    add(l,r,v,a,m,2*k+1);
    add(l,r,v,m,b,2*k+2);
    seg[k] = min(seg[2*k+1],seg[2*k+2])+sum[k];
  }
}
void add(int l,int r,ll v){
  add(l,r,v,0,N,0);
}
ll query(int l,int r,int a,int b,int k){
  if(r<=a || b<=l)return 1e18;
  if(l<=a && b<=r){
    return seg[k];
  }else{
    int m = (a+b)/2;
    return min(query(l,r,a,m,2*k+1),query(l,r,m,b,2*k+2))+sum[k];
  }
}
ll query(int l,int r){
  return query(l,r,0,N,0);
}
 
int r,c,n;
pii ps[125252];
ll val[125252];
map<pii,int> rev;
 
vi xs[125252];
vi ys[125252];
vector<pll> g[125252];
ll dist[125252];
bool used[125252];
 
bool po[125252];
vi node;
int vere[125252];
 
bool check(bool yoyoyo){
  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 = 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);
      }
    }
  }
  // DEBUG("YEY");
  // REP(i,a)printf("%lld ",dist[i]);putchar('\n');
  // negative check
  if(!yoyoyo){
    init(a,dist);
    REP(i,a){
      ll mn = query(0,a);
      ll po = INF;
      // DEBUG(node[i]);
      REP(j,ys[node[i]].size()){
        // DEBUG(ys[node[i]][j]);
        // DEBUG(rev[pii(node[i],ys[node[i]][j])]);
        // DEBUG(val[rev[pii(node[i],ys[node[i]][j])]]);
        CHMIN(po,(ll)val[rev[pii(node[i],ys[node[i]][j])]]);
      }
      // DEBUG(mn);
      // DEBUG(po);
      if(mn + po < 0){
        return false;
      }
      if(i==a-1)break;
      ll d = dist[i+1]-dist[i];
      add(0,a,-d);
    }
  }else{
    init(a,dist);
    REP(i,a){
      // REP(j,a)DEBUG(query(j,j+1));
      ll mn = query(0,a);
      ll po = INF;
      // DEBUG(node[i]);
      REP(j,xs[node[i]].size()){
        // DEBUG(ys[node[i]][j]);
        // DEBUG(rev[pii(node[i],ys[node[i]][j])]);
        // DEBUG(val[rev[pii(node[i],ys[node[i]][j])]]);
        CHMIN(po,(ll)val[rev[pii(xs[node[i]][j],node[i])]]);
      }
      if(mn + po < 0){
        return false;
      }
      if(i==a-1)break;
      ll d = dist[i+1]-dist[i];
      add(0,a,-d);
    }
  }
  return true;
}
 
bool valid(int n,bool yoyoyo){
  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));
    // DEBUG_VEC(node);
    if(!check(yoyoyo))return false;
  }
  return true;
}
 
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);
  }
  map<int,int> Mx,My;
  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,n){
    int x,y;
    x=Mx[ps[i].first];
    y=My[ps[i].second];
    xs[y].push_back(x);
    ys[x].push_back(y);
    ps[i] = pii(x,y);
    rev[ps[i]] = i;
  }
  // graph
  REP(i,125252)g[i].clear();
  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)];
      ll sa = val[tid]-val[sid];
      g[s].push_back(pll(t,sa));
      g[t].push_back(pll(s,-sa));
    }
  }
  if(!valid(r,true)){
    puts("No");
    return 0;
  }
  // graph
  REP(i,125252)g[i].clear();
  REP(i,c){
    sort(ALL(xs[i]));
    vi &vec = xs[i];
    REP(j,vec.size()-1){
      int s,t;
      s = vec[j];
      t = vec[j+1];
      int sid = rev[pii(s,i)];
      int tid = rev[pii(t,i)];
      ll sa = val[tid]-val[sid];
      g[s].push_back(pll(t,sa));
      g[t].push_back(pll(s,-sa));
    }
  }
  if(!valid(c,false)){
    puts("No");
    return 0;
  }
  // ok
  puts("Yes");
  return 0;
}


Measured memory_bytes: 42368