#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

const ld PI = acos(-1.0);
const ll LINF = (ll)1e18 + 5;
const int INF = (int)1e9 + 5;

template<class T>
T sqr(T x) { return x * x; }

template<class T>
T abs(T x) { return x < 0 ? -x : x; }

template<class T>
ll round(T x) { return x < 0 ? x - 0.5 : x + 0.5; }

template<class T>
bool chmin(T & x, const T & y) {
	if (y < x) {
		x = y;
		return true;
	}
	return false;
}

template<class T>
bool chmax(T & x, const T & y) {
	if (x < y) {
		x = y;
		return true;
	}
	return false;
}


template<class P, class Q>
ostream & operator <<(ostream & os, const pair<P, Q> & p) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template<class T>
ostream & operator <<(ostream & os, const vector<T> & v) {
	bool was = false;
	os << "{";
	for (typename vector<T>::const_iterator it = v.begin(); it != v.end(); it++) {
		if (was) {
			os << ", ";
		}
		else {
			was = true;
		}
		os << *it;
	}
	os << "}";
	return os;
}

template<class T>
ostream & operator <<(ostream & os, const set<T> & v) {
	bool was = false;
	os << "{";
	for (typename set<T>::const_iterator it = v.begin(); it != v.end(); it++) {
		if (was) {
			os << ", ";
		}
		else {
			was = true;
		}
		os << *it;
	}
	os << "}";
	return os;
}

template<class T>
ostream & operator <<(ostream & os, const multiset<T> & v) {
	bool was = false;
	os << "{";
	for (typename multiset<T>::const_iterator it = v.begin(); it != v.end(); it++) {
		if (was) {
			os << ", ";
		}
		else {
			was = true;
		}
		os << *it;
	}
	os << "}";
	return os;
}

template<class P, class Q>
ostream & operator <<(ostream & os, const map<P, Q> & v) {
	bool was = false;
	os << "{";
	for (typename map<P, Q>::const_iterator it = v.begin(); it != v.end(); it++) {
		if (was) {
			os << ", ";
		}
		else {
			was = true;
		}
		os << *it;
	}
	os << "}";
	return os;
}

#define all(x) (x).begin(), (x).end()

template<class T>
T nextInt() {
	ll x = 0;
	bool p = false;
	char c;
	do {
		c = getchar();
	} while (c <= 32);
	if (c == '-') {
		p = true;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return (p ? -x : x);
}

bool check(int R, int C, vector<int> r, vector<int> c, vector<int> a) {
	map<int, vector<pair<int, int>>> mapp;
	vector<vector<pair<int, int>>> g(C + 1);
	int n = (int)r.size();
	for (int i = 0; i < n; i++) {
		mapp[r[i]].push_back({c[i], a[i]});
	}
	for (const auto & it : mapp) {
		const auto & vec = it.second;
		for (int i = 0; i + 1 < (int)vec.size(); i++) {
			int from = vec[i].first;
			int to = vec[i + 1].first;
			int fromVal = vec[i].second;
			int toVal = vec[i + 1].second;
			g[from].push_back({to, toVal - fromVal});
			g[to].push_back({from, fromVal - toVal});
		}
	}
	vector<ll> values(C + 1);
	vector<int> used(C + 1);
	int colorCnt;
	bool ok = true;
	function<void(int, ll)> dfs;
	dfs = [&](int v, ll c) {
		if (used[v]) {
			if (values[v] != c) {
				ok = false;
			}
			return;
		}
		used[v] = colorCnt;
		values[v] = c;
		for (auto p : g[v]) {
			int to = p.first;
			int cst = p.second;
			dfs(to, c + cst);
		}
	};
	for (int i = 1; i <= C; i++) {
		if (used[i] == 0) {
			colorCnt++;
			dfs(i, 0);
		}
	}
	vector<vector<int>> idxs(colorCnt + 1);
	vector<vector<int>> vertices(colorCnt + 1);
	for (int i = 0; i < n; i++) {
		idxs[used[c[i]]].push_back(i);
	}
	for (int i = 1; i <= C; i++) {
		vertices[used[i]].push_back(i);
	}
	for (int color = 1; color <= colorCnt; color++) {
		int pos = -1;
		for (int i : vertices[color]) {
			if (pos == -1 || values[i] < values[pos]) {
				pos = i;
			}
		}
		for (int i : idxs[color]) {
			ll cur = a[i];
			int curVertex = c[i];
			ll z = cur + (values[pos] - values[curVertex]);
			if (z < 0) {
				ok = false;
			}
		}
	}
	return ok;
}

int main() {
	srand(time(0));

#ifdef LOCAL
	//gen();
	freopen("input.txt", "r", stdin);
#else
	
#endif

	int R, C, n;

	scanf("%d%d", &R, &C);
	scanf("%d", &n);
	vector<int> r(n), c(n), a(n);

	for (int i = 0; i < n; i++) {
		scanf("%d%d%d", &r[i], &c[i], &a[i]);
	}

	bool res = check(R, C, r, c, a);
	
	swap(r, c);
	swap(R, C);

	res = res && check(R, C, r, c, a);

	puts(res ? "Yes" : "No");
}


Measured memory_bytes: 29568