#include <algorithm>  
#include <iostream>  
#include <sstream>  
#include <string>  
#include <cstring>
#include <vector>  
#include <queue>  
#include <set>  
#include <map>  
#include <cstdio>  
#include <cstdlib>  
#include <cctype>  
#include <cmath>  
#include <list>  
#include <cassert>
#include <ctime>
#include <climits>
using namespace std;  

#define PB push_back  
#define MP make_pair  
#define SZ(v) ((int)(v).size())  
#define FOR(i,a,b) for(int i=(a);i<(b);++i)  
#define REP(i,n) FOR(i,0,n)  
#define FORE(i,a,b) for(int i=(a);i<=(b);++i)  
#define REPE(i,n) FORE(i,0,n)  
#define FORSZ(i,a,v) FOR(i,a,SZ(v))  
#define REPSZ(i,v) REP(i,SZ(v))  
typedef long long ll;
typedef unsigned long long ull;
ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); }

const int MAXN=100000;
const int MAXH=100000;
const int MAXW=100000;

int h,w,n;
int px[MAXN],py[MAXN],pz[MAXN];

int xhead[MAXH],xnxt[MAXN];
int yhead[MAXW],ynxt[MAXN];
bool xdone[MAXH];

int qx[MAXH],qxtail,qxhead;
int qy[MAXW],qytail,qyhead;
ll xz[MAXH],yz[MAXW];

bool solve() {
	REP(x,h) xhead[x]=-1; REP(i,n) xnxt[i]=xhead[px[i]],xhead[px[i]]=i;
	REP(y,w) yhead[y]=-1; REP(i,n) ynxt[i]=yhead[py[i]],yhead[py[i]]=i;
	REP(x,h) xz[x]=-1; REP(y,w) yz[y]=-1;
	//REP(x,h) { printf("x=%d:",x); for(int at=xhead[x];at!=-1;at=xnxt[at]) printf(" %d=%d",py[at],pz[at]); puts(""); }
	//REP(y,w) { printf("y=%d:",y); for(int at=yhead[y];at!=-1;at=ynxt[at]) printf(" %d=%d",px[at],pz[at]); puts(""); }
	REP(cx,h) if(xz[cx]==-1&&xhead[cx]!=-1) {
		int c=xhead[cx],cy=py[c],cz=pz[c]; xz[cx]=yz[cy]=cz; //printf("starting at (%d,%d)=%d\n",cx,cy,cz);
		qxhead=qxtail=qyhead=qytail=0;
		for(int at=xhead[cx];at!=-1;at=xnxt[at]) if(py[at]!=cy) {
			int ny=py[at],nz=pz[at]; //printf("initx(%d,%d)=%d\n",px[at],py[at],pz[at]);
			assert(yz[ny]==-1); yz[ny]=nz; qy[qyhead++]=ny;
		}
		for(int at=yhead[cy];at!=-1;at=ynxt[at]) if(px[at]!=cx) {
			int nx=px[at],nz=pz[at]; //printf("inity(%d,%d)=%d\n",px[at],py[at],pz[at]);
			assert(xz[nx]==-1); xz[nx]=nz; qx[qxhead++]=nx;
		}
		while(qxtail<qxhead||qytail<qyhead) {
			if(qxtail<qxhead) {
				int x=qx[qxtail++]; //printf("\tprocessing x=%d\n",x);
				for(int at=xhead[x];at!=-1;at=xnxt[at]) if(py[at]!=cy) {
					int ny=py[at];
					ll nz=cz+pz[at]-xz[x]; //printf("\t\t(%d,%d)=%d -> (%d,%d)=%lld\n",px[at],py[at],pz[at],cx,ny,nz);
					if(yz[ny]>=0) if(yz[ny]!=nz) return false; else continue;
					if(nz<0) return false;
					yz[ny]=nz; qy[qyhead++]=ny;
				}
			}
			if(qytail<qyhead) {
				int y=qy[qytail++]; //printf("\tprocessing y=%d\n",y);
				for(int at=yhead[y];at!=-1;at=ynxt[at]) if(px[at]!=cx) {
					int nx=px[at];
					ll nz=cz+pz[at]-yz[y]; //printf("\t\t(%d,%d)=%d -> (%d,%d)=%lld\n",px[at],py[at],pz[at],nx,cy,nz);
					if(xz[nx]>=0) if(xz[nx]!=nz) return false; else continue;
					if(nz<0) return false;
					xz[nx]=nz; qx[qxhead++]=nx;
				}
			}
		}
		ll xmin=cz; REP(i,qxhead) if(xz[qx[i]]<xmin) xmin=xz[qx[i]];
		ll ymin=cz; REP(i,qyhead) if(yz[qy[i]]<ymin) ymin=yz[qy[i]];
		//printf("xmin=%lld ymin=%lld\n",xmin,ymin); REP(i,qxhead) printf("(%d,%d)=%lld ",qx[i],cy,xz[qx[i]]); REP(i,qyhead) printf("(%d,%d)=%lld ",cx,qy[i],yz[qy[i]]); puts("");
		if(xmin+ymin-cz<0) return false;
	}
	return true;
}

void run() {
	scanf("%d%d%d",&h,&w,&n); REP(i,n) scanf("%d%d%d",&px[i],&py[i],&pz[i]),--px[i],--py[i];
	printf("%s\n",solve()?"Yes":"No");
}

int main() {
	run();
	return 0;
}


Measured memory_bytes: 4992