Language: C++

#pragma region include
#include <iostream>
#include <iomanip>
#include <stdio.h>

#include <sstream>
#include <algorithm>
#include <cmath>
#include <complex>

#include <string>
#include <cstring>
#include <vector>
#include <tuple>
#include <bitset>

#include <queue>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>

#include <fstream>
#include <random>
//#include <time.h>
#include <ctime>
#pragma endregion //#include
/////////
#define REP(i, x, n) for(int i = x; i < n; ++i)
#define rep(i,n) REP(i,0,n)
#define ALL(X) X.begin(), X.end()
/////////
#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef std::pair<LL,LL> PLL;//
typedef std::pair<int,int> PII;//
#pragma endregion //typedef
////定数
const int INF = (int)1e9;
const LL MOD = (LL)1e9+7;
const LL LINF = (LL)1e18+20;
const double PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace::std;

/*
thx
http://kurenaif.hatenablog.com/entry/2016/09/26/000341
*/
vector< vector< edge_base > > gra;
vector<LL> weight;
int R,C;

bool dfs(int node,LL& Xmin,LL& Ymin){
	/*頂点:nodeの重みを決めてからここにくる。*/
	if( node < R ){//Xの頂点,最小値の更新
		Xmin = min( Xmin, weight[node] );
	}else{//Yの頂点,最小値の更新
		Ymin = min( Ymin, weight[node] );
	}
	int size = gra[node].size();
	for(int i=0;i<size;++i){
		int to = gra[node][i].to;
		LL val = gra[node][i].cost;//辺の容量的なやつ
		if( weight[to] == LINF ){//頂点の重みが決まってない
			//片方が決まっているなら分ける。
			weight[to] = val - weight[node];
			if( dfs(to,Xmin,Ymin) == false ){
				return false;
			}
		}else{
			/*ある辺の２頂点の重みが両方決まっているなら
			辺の容量と一致しているか調べる。
			*/
			if( weight[to] + weight[node] != val ){
				return false;
			}
		}
	}
	return true;
}

void solve(){
	int N;
	cin >> R >> C >> N;
	weight.resize(R+C,LINF);
	gra.resize(R+C);

	for(int i=0;i<N;++i){
		int r,c,a;
		cin >> r >> c >> a;
		--r;--c;
		gra[r].push_back( make_edge_base(R+c,a) );
		gra[R+c].push_back( make_edge_base(r,a) );
	}

	bool res = true;
	LL Xmin,Ymin;
	for(int i=0;i<R+C;++i){//各頂点についてループ
		//頂点の重みが決まっていない &&
		//繋がっている頂点がある(:=制約がある)
		/*連結成分毎に調べている。*/
		if( weight[i] == LINF && gra[i].size() > 0 ){
			Xmin = Ymin = LINF;//dfs内部で値を変更している。
			weight[i] = 0;//重みを仮定して調べる。
			//評価順に注意dfs->Xmin,Ymin
			if( dfs(i,Xmin,Ymin) == false || Xmin+Ymin < 0 ){
				cout << "No" << endl;
				return;
			}
		}
	}
	cout << "Yes" << endl;
}

#pragma region main
signed main(void){
	std::cin.tie(0);
	std::ios::sync_with_stdio(false);
	std::cout << std::fixed;//小数を10進数表示
	cout << setprecision(16);//小数点以下の桁数を指定//coutとcerrで別	

	solve();
}
#pragma endregion //main()

/*
解説pdf https://goo.gl/fmi59I
＊　N個の(r_k,c_k,a_k)は入力として与えられる。
＊左辺に(i,*),右辺に(i+1,*)
＊全ての行で、列(j)の値からから列(j+1)の値の差は等しい。
＊列(j+1)-列(j)の値をdiff(j+1)とする、また
diff(1) = 列(1)//?とりま累積和にする。
とすると、
列(J) = Σ[j=1,J]diff(j) = y_(J)
となる。

＊同様に
条件3の式を変形すると
b_(i+1,j) - b_(i,j) = b_(i+1,j+1) - b_(i,j+1)
となり
全ての列で、行(i)の値からから行(i+1)の値の差は等しい。

行(i+1)-行(i)の値をdiff(i+1)とする、また
diff(1) = 行(1)//
とすると、
行(R) = Σ[r=1,R]diff(r) = x_(R)
となる。
*/

Compiler output:
a.cc:54:17: error: 'edge_base' was not declared in this scope
   54 | vector< vector< edge_base > > gra;
      |                 ^~~~~~~~~
a.cc:54:27: error: template argument 1 is invalid
   54 | vector< vector< edge_base > > gra;
      |                           ^
a.cc:54:27: error: template argument 2 is invalid
a.cc:54:29: error: template argument 1 is invalid
   54 | vector< vector< edge_base > > gra;
      |                             ^
a.cc:54:29: error: template argument 2 is invalid
a.cc: In function 'bool dfs(int, LL&, LL&)':
a.cc:65:23: error: invalid types 'int[int]' for array subscript
   65 |         int size = gra[node].size();
      |                       ^
a.cc:67:29: error: invalid types 'int[int]' for array subscript
   67 |                 int to = gra[node][i].to;
      |                             ^
a.cc:68:29: error: invalid types 'int[int]' for array subscript
   68 |                 LL val = gra[node][i].cost;//辺の容量的なやつ
      |                             ^
a.cc: In function 'void solve()':
a.cc:91:13: error: request for member 'resize' in 'gra', which is of non-class type 'int'
   91 |         gra.resize(R+C);
      |             ^~~~~~
a.cc:97:20: error: invalid types 'int[int]' for array subscript
   97 |                 gra[r].push_back( make_edge_base(R+c,a) );
      |                    ^
a.cc:97:35: error: 'make_edge_base' was not declared in this scope
   97 |                 gra[r].push_back( make_edge_base(R+c,a) );
      |                                   ^~~~~~~~~~~~~~
a.cc:98:20: error: invalid types 'int[int]' for array subscript
   98 |                 gra[R+c].push_back( make_edge_base(r,a) );
      |                    ^
a.cc:107:45: error: invalid types 'int[int]' for array subscript
  107 |                 if( weight[i] == LINF && gra[i].size() > 0 ){
      |                                             ^