/**
 *    author:  [itmo] enot.1.10
 *    created: 24.09.2016 15:17:22       
**/
#define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

#define F first
#define S second
#define pb push_back
#define mp make_pair
#define forn(i, n) for(int i = 0 ; (i) < (n) ; ++i)
#define eprintf(...) fprintf(stderr, __VA_ARGS__),fflush(stderr)
#define sz(a) ((int)(a).size())
#define all(a) (a).begin(),a.end()
#define pw(x) (1LL<<(x))

using namespace std;

typedef long long ll;
typedef double dbl;
typedef vector<int> vi;
typedef pair<int, int> pi;

const int inf = 1.01e9;
const dbl eps = 1e-9;

/* --- main part --- */

const int N = 1e5 + 10;

vi r[N];
vi c[N];


vector<pi> E1[N];
vector<pi> E2[N];

inline void add1(int xx, int yy, int cc)
{
    E1[xx].pb({yy, cc});
    E1[yy].pb({xx, -cc});
}
inline void add2(int xx, int yy, int cc)
{
    E2[xx].pb({yy, cc});
    E2[yy].pb({xx, -cc});
}

int mark1[N];
ll val1[N];
int mark2[N];
ll val2[N];
int OK = 1;

void dfs1(int x, ll vv)
{
    mark1[x] = 1;
    val1[x] = vv;
    forn(i, sz(E1[x]))
    {
        int yy = E1[x][i].F;
        int cc = E1[x][i].S;
        if (mark1[yy])
        {
            OK &= val1[yy] == val1[x] + cc;
        }
        else
        {
            dfs1(yy, val1[x] + cc);
        }
    }
}
void dfs2(int x, ll vv)
{
    mark2[x] = 1;
    val2[x] = vv;
    forn(i, sz(E2[x]))
    {
        int yy = E2[x][i].F;
        int cc = E2[x][i].S;
        if (mark2[yy])
        {
            OK &= val2[yy] == val2[x] + cc;
        }
        else
        {
            dfs2(yy, val2[x] + cc);
        }
    }
}
ll mnx, mny;

void dfs11(int x)
{
    mark1[x] = 1;
    mnx = min(mnx, val1[x]);
    forn(i, sz(E1[x]))
    {
        int yy = E1[x][i].F;
        if (!mark1[yy])
        {
            dfs11(yy);
        }
    }
}
void dfs22(int x)
{
    mark2[x] = 1;
    mny = min(mny, val2[x]);
    forn(i, sz(E2[x]))
    {
        int yy = E2[x][i].F;
        if (!mark2[yy])
        {
            dfs22(yy);
        }
    }
}


int x[N], y[N], v[N];
int one[N];

int main()
{
    #ifdef home
        assert(freopen("1.in", "r", stdin));
        assert(freopen("1.out", "w", stdout));
    #endif
    int R, C;
    int n;
    scanf("%d%d%d", &R, &C, &n);
    forn(i, n)
    {
        scanf("%d%d%d", &x[i], &y[i], &v[i]);
        r[x[i]].pb(i);
        c[y[i]].pb(i);
    }

    forn(i, N) if (sz(r[i]) >= 2)
    {
        vector<pi> vv;
        forn(j, sz(r[i]))
        {
            int id = r[i][j];
            vv.pb({y[id], v[id]});
        }
        forn(j, sz(vv) - 1)
        {
            add1(vv[j].F, vv[j + 1].F, vv[j + 1].S - vv[j].S);
        }
    }                          
    forn(i, N) if (!mark1[i]) dfs1(i, 0);
    


    //for (int i = 1; i <= 2; ++i) eprintf("%I64d ", val[i]);
    //eprintf("\n");    

    forn(i, N) one[i] = inf;
    forn(i, N) if (sz(c[i]) >= 2)
    {
        vector<pi> vv;
        forn(j, sz(c[i]))
        {
            int id = c[i][j];
            vv.pb({x[id], v[id]});
        }
        forn(j, sz(vv) - 1)
        {
            add2(vv[j].F, vv[j + 1].F, vv[j + 1].S - vv[j].S);
        }
    }
    forn(i, N) if (!mark2[i]) dfs2(i, 0);

    memset(mark1, 0, sizeof mark1);
    memset(mark2, 0, sizeof mark2);
    
    forn(i, N) if (mark1[x[i]] == 0 || mark2[y[i]] == 0)
    {
        mnx = inf;
        mny = inf;
        dfs11(y[i]);
        dfs22(x[i]);
        if (mnx + mny - (val1[y[i]] + val2[x[i]] - v[i]) < 0) OK = 0;
    }



    //for (int i = 1; i <= 2; ++i) eprintf("%I64d ", val[i]);
    //eprintf("\n");    

    //eprintf("%I64d %I64d\n", mnx, mny);
    

    if (OK) printf("Yes\n");
    else printf("No\n");


    #ifdef home
        eprintf("time = %d ms\n", (int)(clock() * 1000. / CLOCKS_PER_SEC));
    #endif
    return 0;
}


Measured memory_bytes: 22144