#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cassert>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
#include <cassert>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 1000
#define mod 1000000007
#define fi first
#define sc second
#define rep(i,x) for(int i=0;i<x;i++)
#define SORT(x) sort(x.begin(),x.end())
#define ERASE(x) x.erase(unique(x.begin(),x.end()),x.end())
#define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin())
#define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin())
int r,c,n;
int x[100005],y[100005],a[100005];
vector<P>tate[100005],yoko[100005];
vector<P>tate2[100005],yoko2[100005];
ll val[100005],val2[100005];
bool used[100005];
int ty[100005],ty2[100005];
ll MX[100005],MY[100005];
int main(){
	cin>>r>>c>>n;
	rep(i,n){
		scanf("%d%d%d",&x[i],&y[i],&a[i]);
		tate[x[i]].pb(mp(y[i],a[i]));
		yoko[y[i]].pb(mp(x[i],a[i]));
	}
	for(int i=1;i<=r;i++){
		for(int j=1;j<tate[i].size();j++){
			tate2[tate[i][j].fi].pb(mp(tate[i][j-1].fi,tate[i][j].sc-tate[i][j-1].sc));
			tate2[tate[i][j-1].fi].pb(mp(tate[i][j].fi,-tate[i][j].sc+tate[i][j-1].sc));
		}
	}
	for(int i=1;i<=c;i++){
		for(int j=1;j<yoko[i].size();j++){
			yoko2[yoko[i][j].fi].pb(mp(yoko[i][j-1].fi,yoko[i][j].sc-yoko[i][j-1].sc));
			yoko2[yoko[i][j-1].fi].pb(mp(yoko[i][j].fi,-yoko[i][j].sc+yoko[i][j-1].sc));
		}
	}
	//cout << yoko2[1].size() << endl;
	fill(val,val+100005,-1e18); fill(val2,val2+100005,-1e18);
	fill(MX,MX+100005,-1e18); fill(MY,MY+100005,-1e18);
	for(int i=1;i<=c;i++){
		if(used[i]) continue;
		queue<int>que;
		que.push(i); val[i] = 0;
		while(!que.empty()){
			int q = que.front(); que.pop();
			if(used[q]) continue; used[q] = 1; ty[q] = i; MX[i] = max(MX[i],val[q]);
			for(int j=0;j<tate2[q].size();j++){
				if(used[tate2[q][j].fi]) continue;
				if(val[tate2[q][j].fi] >= -1e17) continue;
				val[tate2[q][j].fi] = val[q]+tate2[q][j].sc;
				que.push(tate2[q][j].fi); 
			}
		}
	}
	memset(used,0,sizeof(used));
	for(int i=1;i<=r;i++){
		if(used[i]) continue;
		queue<int>que;
		que.push(i); val2[i] = 0;
		while(!que.empty()){
			int q = que.front(); que.pop();
			if(used[q]) continue; used[q] = 1; ty2[q] = i; MY[i] = max(MY[i],val2[q]);
			for(int j=0;j<yoko2[q].size();j++){
				if(used[yoko2[q][j].fi]) continue;
				if(val2[yoko2[q][j].fi] >= -1e17) continue;
				val2[yoko2[q][j].fi] = val2[q]+yoko2[q][j].sc;
				que.push(yoko2[q][j].fi);
			}
		}
	}
//	for(int i=1;i<=r;i++) cout << val2[i] << endl;
	for(int i=1;i<=r;i++){
		for(int j=1;j<tate[i].size();j++){
			if(val[tate[i][j-1].fi]-tate[i][j].sc+tate[i][j-1].sc != val[tate[i][j].fi]){
				puts("No"); return 0;
			}
		}
	}
	for(int i=1;i<=c;i++){
		for(int j=1;j<yoko[i].size();j++){
			if(val2[yoko[i][j-1].fi]-yoko[i][j].sc+yoko[i][j-1].sc != val2[yoko[i][j].fi]){
				puts("No"); return 0;
			}
		}
	}
	for(int i=1;i<=n;i++){
		ll hoge = a[i]+(val[y[i]]-MX[ty[y[i]]]);
		ll hoge2 = a[i]+(val2[x[i]]-MY[ty2[x[i]]]);
		if(hoge<0 || hoge2<0){
			puts("No"); return 0;
		}
	}
	puts("Yes");
}

Measured memory_bytes: 23168