#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int R,C;
vector<pair<int,int> > Row[111111];
vector<pair<int,int> > col[111111];
int ace[111111];
long long int dif[111111];
long long int mindif[111111];
int ancestor(int x){
	int y = ace[x];
	if(y == x)return x;
	int z = ancestor(y);
	dif[x] += dif[y];
	return ace[x] = z;
}
bool chk(vector<pair<int,int> > row[111111], int n,int todo){
	for(int i=1; i<=todo; i++){
		ace[i] = i;
		dif[i] = 0;
	}
	for(int i=1; i<=n; i++){
		sort(row[i].begin(),row[i].end());
		int l = row[i].size();
		for(int j=0; j<l-1; j++){
			int x = row[i][j].first;long long int xval = row[i][j].second;
			int y = row[i][j+1].first; long long int yval = row[i][j+1].second;
			int X = ancestor(x);
			int Y = ancestor(y);
			if(X != Y){
				ace[X] = Y;
				dif[X] = (xval - dif[x])-(yval - dif[y]);
			}else{
				if(yval - dif[y] != xval - dif[x])
					return false;
			}
		}
	}
	for(int i=1; i<=todo; i++)
		mindif[i] = dif[i];
	for(int i=1; i<=todo; i++){
		ancestor(i);
		mindif[ace[i]] = min(mindif[ace[i]], dif[i]);
	}
	for(int i=1; i<=n; i++){
		int l = row[i].size();
		for(int j=0; j<l; j++){
			int x = row[i][j].first; long long int xval = row[i][j].second;
			if(xval - dif[x] + mindif[ace[x]] < 0)
				return false;
		}
	}
	return true;
}
int main(){
	int N;
	scanf("%d%d%d",&R,&C,&N);
	while(N--){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		Row[x].push_back(make_pair(y,z));
		col[y].push_back(make_pair(x,z));
	}
	puts(chk(Row,R,C) && chk(col, C,R) ? "Yes" : "No");
	return 0;
}