#include <bits/stdc++.h>
        #include<iostream>
        #include<cstdio>
        #include<vector>
        #include<queue>
        #include<map>
        #include<cstring>
        #include<string>
        #include <math.h>
        #include<algorithm>
    //    #include <boost/multiprecision/cpp_int.hpp>
        #include<functional>
      #define int long long
        #define inf  1000000007
        #define pa pair<int,int>
#define ll long long
        #define pal pair<ll,ll>
        #define ppa pair<int,pa>
        #define  mp make_pair
        #define EPS (1e-10)
        #define equals(a,b) (fabs((a)-(b))<EPS)

        using namespace std;

        class Point{
        	public:
        	double x,y;
        	Point(double x=0,double y=0):x(x),y(y) {}
        	Point operator + (Point p) {return Point(x+p.x,y+p.y);}
        	Point operator - (Point p) {return Point(x-p.x,y-p.y);}
        	Point operator * (double a) {return Point(x*a,y*a);}
        	Point operator / (double a) {return Point(x/a,y/a);}
        	double absv() {return sqrt(norm());}
        	double norm() {return x*x+y*y;}
        	bool operator < (const Point &p) const{
        		return x != p.x ? x<p.x: y<p.y;
        	}
        	bool operator == (const Point &p) const{
        		return fabs(x-p.x)<EPS && fabs(y-p.y)<EPS;
        	}
        };
        typedef Point Vector;

        struct Segment{
        Point p1,p2;
        };

    double hen(Vector a){
    if(fabs(a.x)<EPS && a.y>0) return acos(0);
    else if(fabs(a.x)<EPS && a.y<0) return 3*acos(0);
    else if(fabs(a.y)<EPS && a.x<0) return 2*acos(0);
    else if(fabs(a.y)<EPS && a.x>0) return 0.0;
    else if(a.y>0) return acos(a.x/a.absv());
    else return 2*acos(0)+acos(-a.x/a.absv());

    }

        double dot(Vector a,Vector b){
        	return a.x*b.x+a.y*b.y;
        }
        double cross(Vector a,Vector b){
        	return a.x*b.y-a.y*b.x;
        }
        int dx[4] = {1, 0, -1, 0};
        int dy[4] = {0, 1, 0, -1};
        //----------------kokomade temple------------

vector<pa> Gr[100002],Gc[100002];
int xr[100002],xc[100002];
bool sr[100002]={0},sc[100002]={0};
int r,c,n;

int rmin,cmin;


void dfs(int mae,int ima,int cost,int q){
	if(q==0){
		if(sc[ima]) return;
		xc[ima] = cost - xr[mae];
		sc[ima]=true;
		cmin=min(xc[ima],cmin);
		for(int i=0;i<Gc[ima].size();i++){
			if(sr[Gc[ima][i].first]) continue;
			dfs(ima,Gc[ima][i].first,Gc[ima][i].second,1);
		}
	}
	
	else{
		if(sr[ima]) return;
		xr[ima] = cost - xc[mae];
		sr[ima]=true;
		rmin=min(xr[ima],rmin);
		for(int i=0;i<Gr[ima].size();i++){
			if(sc[Gr[ima][i].first]) continue;
			dfs(ima,Gr[ima][i].first,Gr[ima][i].second,0);
		}
	}
	
	return ;
}



signed main(){

	cin>>r>>c>>n;
	
	for(int i=0;i<n;i++){
		int za,zs,zd;
		cin>>za>>zs>>zd;
		Gr[za].push_back(mp(zs,zd));
		Gc[zs].push_back(mp(za,zd));
		
	}
	
	for(int i=1;i<=r;i++){
		int rr=Gr[i].size();
		if(rr==0) continue;
		if(sr[i]) continue;
		rmin=0;
		cmin=10000000000000ll;
		sr[i]=1;
		xr[i]=0;
		for(int j=0;j<rr;j++){
			dfs(i,Gr[i][j].first,Gr[i][j].second,0);
		}
		if(rmin+cmin<0){
			cout<<"No"<<endl;
				return 0;
		}
	}
	
	for(int i=1;i<=r;i++){
		for(int j=0;j<Gr[i].size();j++){
			if(xr[i]+xc[Gr[i][j].first]!=Gr[i][j].second){
				cout<<"No"<<endl;
				return 0;
			}
			
		}
		
	}
	
	
	
	cout<<"Yes"<<endl;
	return 0;
}

//printf("%.10f\n",ans);


Measured memory_bytes: 16640