#include <bits/stdc++.h>   using namespace std;   long long mInv[41];   long long fact[41];   long long factInv[41];   map<long, long> mymap;   long long heights[5];   long long segTree[3];   long nums[5005];   long g[5005];   vector<long> primes;   vector<long> badPrimes;   long funcVal[1000006];   long long N;   set<string> dictionary;   set<string>::iterator it;   pair<set<string>::iterator, bool> ret;   long long gcd(long long a, long long b) {     if (b == 0) return a;     if (a % b == 0) return b;     return gcd(b, a % b);   }   long long getmoduloInv(long long n) {     if (n == 1) return 1;     if (mInv[n] > 0) return mInv[n];     long long m = (-1 * 1000000007) / n;     m += 1000000007;     m *= getmoduloInv(1000000007 % n);     mInv[n] = (m % 1000000007);     return mInv[n];   }   vector<long> get_primes(unsigned long maxN) {     char *sieve;     sieve = new char[maxN / 8 + 1];     long m = (maxN / 8) + 1;     for (long long i = 0; i < m; i++) sieve[i] = 255;     for (unsigned long x = 2; x <= maxN; x++)       if (sieve[x / 8] & (0x01 << (x % 8))) {         primes.push_back(x);         for (unsigned long j = 2 * x; j <= maxN; j += x)           sieve[j / 8] &= ~(0x01 << (j % 8));       }     delete[] sieve;     return primes;   }   long long getPow(long long b, long long p) {     if (b < 2 || p == 1) return b;     if (p == 0) return 1;     long long val = getPow(b, p / 2);     val *= val;     val %= 1000000007;     if (p % 2 == 1) {       val *= b;       val %= 1000000007;     }     return val;   }   void buildSegTree(long node, long b, long e) {     if (b == e)       segTree[node] = b;     else {       long mid = (b + e) / 2;       buildSegTree(node * 2, b, mid);       buildSegTree(1 + node * 2, mid + 1, e);       if (heights[segTree[node * 2]] <= heights[segTree[1 + node * 2]])         segTree[node] = segTree[node * 2];       else         segTree[node] = segTree[1 + node * 2];     }   }   long long getMin(long node, long segBeg, long segEnd, long qBeg, long qEnd) {     if (segEnd < qBeg || segBeg > qEnd) return N + 1;     if (segBeg >= qBeg && segEnd <= qEnd) return segTree[node];     long mid = (segBeg + segEnd) / 2;     long fh = getMin(node * 2, segBeg, mid, qBeg, qEnd);     long sh = getMin(1 + node * 2, mid + 1, segEnd, qBeg, qEnd);     if (heights[sh] < heights[fh]) return sh;     return fh;   }   string genMinString(long long val) {     long len = val / 9, firstDigit = val % 9;     string s =   ;     if (firstDigit > 0) {       char ch =  0  + firstDigit;       s = ch + s;     }     for (long i = 0; i < len; i++) s = s +  9 ;     return s;   }   long maxBuild;   vector<long> mult(vector<long> A, vector<long> B) {     long len1 = A.size(), len2 = B.size();     vector<long> C;     for (long i = 0; i < len1; i++) {       long carry = 0;       for (long j = 0; j < len2; j++) {         long pos = i + j;         long val = carry + (A[i] * B[j]);         carry = val / 10;         val = val % 10;         if (pos >= C.size()) {           C.push_back(val);         } else {           C[pos] += val;           carry = C[pos] / 10;           C[pos] = C[pos] % 10;         }       }       if (carry > 0) C.push_back(carry);     }     return C;   }   vector<long> getVal(long power) {     vector<long> C;     C.push_back(5);     if (power == 1) return C;     vector<long> B = getVal(power / 2);     B = mult(B, B);     if (power % 2 == 1) B = mult(B, C);     return B;   }   long getZeros(long fives) {     long ans = 0;     while (fives > 0) {       ans += fives;       fives /= 5;     }     return ans;   }   long long getPow(long zeros) {     long val = ((zeros * 4) / 5) - 1;     while (getZeros(val) < zeros) val++;     if (getZeros(val) == zeros) return val;     return -1;   }   long long rowVal[5050], colVal[5050];   long long rowAlter[5050], colAlter[5050];   int main(void) {     long long test_cases = 1, l, r, seed = 1, maxVal;     vector<string> originalStrings;     long long curNum;     long long m, n, k;     long long ans = 0;     for (long T = 0; T < test_cases; T++) {       cin >> n >> m >> k;       long rv, cv, av;       memset(rowVal, 0, sizeof(rowVal));       memset(colVal, 0, sizeof(colVal));       memset(rowAlter, -1, sizeof(rowAlter));       memset(colAlter, -1, sizeof(colAlter));       for (long i = 0; i < k; i++) {         scanf( %ld , &av);         scanf( %ld , &rv);         rv--;         scanf( %ld , &cv);         if (av == 1) {           rowVal[rv] = cv;           rowAlter[rv] = i;         } else {           colVal[rv] = cv;           colAlter[rv] = i;         }       }       for (long i = 0; i < n; i++) {         for (long j = 0; j < m; j++) {           if (rowAlter[i] > colAlter[j])             printf( %ld  , rowVal[i]);           else             printf( %ld  , colVal[j]);         }         cout << endl;       }     }     return 0;   }