Problem:
Score : 800 points

Problem Statement

There is a grid with R rows and C columns.
We call the cell in the r-th row and c-th column (r，c).

Mr. Takahashi wrote non-negative integers into N of the cells, that is, he wrote a non-negative integer a_i into (r_i，c_i) for each i (1≤i≤N).
After that he fell asleep.

Mr. Aoki found the grid and tries to surprise Mr. Takahashi by writing integers into all remaining cells.
The grid must meet the following conditions to really surprise Mr. Takahashi.

Condition 1: Each cell contains a non-negative integer.

Condition 2: For any 2×2 square formed by cells on the grid, the sum of the top left and bottom right integers must always equal to the sum of the top right and bottom left integers.

Determine whether it is possible to meet those conditions by properly writing integers into all remaining cells.

Constraints

2≤R，C≤10^5

1≤N≤10^5

1≤r_i≤R

1≤c_i≤C

(r_i，c_i) ≠ (r_j，c_j) (i≠j)

a_i is an integer.

0≤a_i≤10^9

Input

The input is given from Standard Input in the following format:

R C
N
r_1 c_1 a_1
r_2 c_2 a_2
:
r_N c_N a_N

Output

Print Yes if it is possible to meet the conditions by properly writing integers into all remaining cells.
Otherwise, print No.

Sample Input 1

2 2
3
1 1 0
1 2 10
2 1 20

Sample Output 1

Yes

You can write integers as follows.

Sample Input 2

2 3
5
1 1 0
1 2 10
1 3 20
2 1 30
2 3 40

Sample Output 2

No

There are two 2×2 squares on the grid, formed by the following cells:

Cells (1，1), (1，2), (2，1) and (2，2)

Cells (1，2), (1，3), (2，2) and (2，3)

You have to write 40 into the empty cell to meet the condition on the left square, but then it does not satisfy the condition on the right square.

Sample Input 3

2 2
3
1 1 20
1 2 10
2 1 0

Sample Output 3

No

You have to write -10 into the empty cell to meet condition 2, but then it does not satisfy condition 1.

Sample Input 4

3 3
4
1 1 0
1 3 10
3 1 10
3 3 20

Sample Output 4

Yes

You can write integers as follows.

Sample Input 5

2 2
4
1 1 0
1 2 10
2 1 30
2 2 20

Sample Output 5

No

All cells already contain a integer and condition 2 is not satisfied.

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#include <omp.h>

using namespace std;

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


//#define int ll
#define rand shittttty_shit
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng_64(chrono::steady_clock::now().time_since_epoch().count());


typedef pair<int, int> pii;
typedef pair<string, string> pst;
typedef pair<pii, pii> piii;
typedef vector<piii> vpii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector< vi > vvi;
typedef vector< vvi > vvvi;
typedef vector<pii> vpi;
typedef vector<short> vs;
typedef vector<vs> vvs;
typedef vector<vvs> vvvs;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<vvl> vvvl;
typedef vector<ld> vld;
typedef vector<vld> vvld;
typedef vector<vvld> vvvld;
typedef vector<string> vst;
typedef vector<vst> vvst;
typedef pair<ld, ld> pld;
typedef pair<pld, pld> pldd;
typedef vector<pld> vpd;
typedef complex<double> base;


#define inmin(a, b) a = min(a, (b))
#define inmax(a, b) a = max(a, (b))
#define my_abs(a) (((a) >= 0) ? (a) : -(a))
#define mp(a, b) make_pair(a, (b))
#define ALL(a) a.begin(),a.end()
#define RALL(a) a.rbegin(),a.rend()
#define sqr(x) ((x) * (x))
#define fori(i, n) for(int i = 0; i < int(n); ++i)
#define SZ(a) ((int)((a).size()))
#define MODIK(a) (a >= M ? a - M : a)
#define triple(T) tuple<T, T, T>
#define quad(T) tuple<T, T, T, T>
#define watch(x) cout << (#x) << " = " << x << endl;
#ifdef ART_HOME
#define cerr cout
#else
#define cerr if (false) cerr
#endif


const double PI = 2 * acos(0.0);

const string DIGITS = "0123456789";
const string ALPH = "abcdefghijklmnopqrstuvwxyz";

istream &operator >> (istream &in, pii &a)
{
    in >> a.first >> a.second;
    return in;
}


ostream &operator << (ostream &out, pii &a)
{
    out << a.first << ' ' << a.second;
    return out;
}


istream &operator >> (istream &in, pld &a)
{
    in >> a.first >> a.second;
    return in;
}


ostream &operator << (ostream &out, pld &a)
{
    out << a.first << ' ' << a.second;
    return out;
}


template <class T0, class T1>
inline ostream & operator << (ostream &out, pair<T0, T1> &a) {
    return out << "{" << a.first << ", " << a.second << "}";
}

template <class T0, class T1, class T2>
inline ostream & operator << (ostream &out, tuple<T0, T1, T2> &a) {
    return out << "{" << get<0>(a) << ", " << get<1>(a) << ", " << get<2>(a) << "}";
}

template <class T0, class T1, class T2, class T3>
inline ostream & operator << (ostream &out, tuple<T0, T1, T2, T3> &a) {
    return out << "{" << get<0>(a) << ", " << get<1>(a) <<
               ", " << get<2>(a) << ", " <<  get<3>(a) << "}";
}

template<class T>
inline ostream & operator << (ostream &out, vector<T> &a) {
    out << "[";
    fori (i, a.size())
        out << a[i] << vector<string>{", ", "]  "}[i + 1 == a.size()];
    return out;
}


void print(int a, int b, int n, vi h)
{
    ofstream cout("output.txt");
    cout << SZ(h) << ' ' << a << ' ' << b << '\n';
    for (int i = 0; i < SZ(h); ++i) {
        cout << h[i]  << ' ';
    }
    cout.close();
    exit(0);
}


inline bool break_time(ld time)
{
    return clock() > CLOCKS_PER_SEC * time;
}


void bonds()
{
    ld price, nkd, kd, year;
    int cnt;
    cout << "price nkd kd cnt year\n";
    cout << endl;
    cin >> price >> nkd >> kd >> cnt >> year;
    cout << 100 * ((1000 + kd * cnt - price * 10 - nkd) / (price * 10) / year);
}


ld get_rand_ld(ld l, ld r)
{
    uniform_real_distribution<double> gen(l, r);
    return gen(rng);
}


bool may(int E, ld T)
{
    if (E < 0)
        return 1;

    double eps = get_rand_ld(0, 1);
    return eps < exp(-E / T);
}


void smain();

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

#ifdef ART_HOME
    freopen("input.txt", "r", stdin);
    clock_t start = clock();
#endif
    cout << setprecision(2) << fixed;
    smain();
#ifdef ART_HOME
    cout << "\nTOTAL EXECUTIOn TIME: " << float( clock () - start ) /  CLOCKS_PER_SEC << endl;
#endif
}


const int N = 1e5 + 10, pw = 17, K = 2e3 + 10, B = 1.1e10, oo = 2e14, M = 1 << 14, LOG = 20;
const int M1 = 1000000093, x1 = 27162;
const int M2 = 1000000087, x2 = 241;
const ld pi = atan2(1, 0) * 2, EPS = 1e-9;


vpi col[N], str[N];
int used[N], val[N], gval[N], label = 1;
vpi g[N];


void dfs(int v, int vl)
{
    used[v] = 1;
    val[v] = vl;

    for (pii p : g[v])
    {
        if (used[p.first])
        {
            if (val[p.first] != vl + p.second)
                label = 0;
        }
        else
            dfs(p.first, vl + p.second);
    }
}


void dfs_init(int v, int last = -1, int p = -1)
{
    if (p != -1)
        g[v].erase(find(ALL(g[v]), mp(p, last)));

    used[v] = 1;
    vpi hui;

    for (auto p : g[v])
    {
        if (used[p.first])
        {
            hui.push_back(p);
        }
        else
        {
            dfs_init(p.first, p.second, v);
        }
    }

    for (auto p : hui)
        g[v].erase(find(ALL(g[v]), p));
}


int dp_down[N];


void dfs_down(int v, int p = -1)
{
    dp_down[v] = 0;

    for (auto p : g[v])
        dfs_down(p.first, v);

    for (auto p : g[v])
        dp_down[v] = min(dp_down[v], dp_down[p.first] + p.second);
}


bool dfs_up(int v, int p = -1, int dp_up = 0, int last = 0)
{
    int cval = dp_up + -last;
    if (min(cval, dp_down[v]) + gval[v] < 0)
        return 0;

    cval = dp_up + -last;
    vi hui, pr, sf;

    for (auto p : g[v])
        hui.push_back(dp_down[p.first] + p.second);

    pr = hui, sf = hui;
    for (int i = 1; i < SZ(pr); ++i)
        pr[i] = min(pr[i], pr[i - 1]);

    for (int i = SZ(sf) - 2; i >= 0; --i)
        sf[i] = min(sf[i], sf[i + 1]);

    bool label = 1;
    for (int i = 0; i < SZ(g[v]); ++i)
    {
        auto p = g[v][i];
        int cnt = cval;
        if (i)
            cnt = min(cnt, pr[i - 1]);

        if (i + 1 != SZ(g[v]))
            cnt = min(cnt, sf[i + 1]);

        label = min(label, dfs_up(p.first, v, cnt, p.second));
    }

    return label;
}


void smain()
{
    int r, c, n;
    cin >> r >> c >> n;

    for (int i = 0; i < N; ++i)
        gval[i] = oo;

    for (int i = 0; i < n; ++i)
    {
        int r, c, v;
        cin >> r >> c >> v;
        str[r].push_back(mp(c, v));
        col[c].push_back(mp(r, v));
        gval[r] = min(gval[r], v);
    }

    for (int i = 0; i < N; ++i)
    {
        stable_sort(ALL(str[i]));
        stable_sort(ALL(col[i]));
    }

    for (int i = 0; i < N; ++i)
    {
        for (int j = 1; j < SZ(col[i]); ++j)
        {
            pii a = col[i][j - 1], b = col[i][j];
            g[a.first].push_back(mp(b.first, b.second - a.second));
            g[b.first].push_back(mp(a.first, a.second - b.second));
        }
    }

    for (int i = 0; i < N; ++i)
    {
        for (auto p : col[i])
        {
            if (!used[p.first])
                dfs(p.first, 0);
        }
    }

    if (!label)
    {
        cout << "No\n";
        return;
    }

    fill(used, used + N, 0);
    for (int i = 1; i <= r; ++i)
    {
        if (!used[i])
            dfs_init(i);
    }

    fill(used, used + N, 0);
    for (int i = 1; i <= r; ++i)
    {
        if (!used[i])
        {
            dfs_down(i);
            if (gval[i] + dp_down[i] < 0)
                label = 0;

            if (!dfs_up(i))
                label = 0;
        }
    }

    if (label)
        cout << "Yes\n";
    else
        cout << "No\n";
}