#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
long long inv(long long a) {
  long long u = 0, v = 1, b = mod;
  while (a) {
    long long t = b / a;
    b -= t * a, u -= t * v;
    swap(a, b);
    swap(u, v);
  }
  u %= mod;
  if (u < 0) u += mod;
  return u;
}
struct mint {
  int x;
  mint() : x(0) {}
  mint(int x) : x(x) {}
  mint(long long x) : x() {
    if (x >= mod || x < -mod) x %= mod;
    if (x < 0) x += mod;
    this->x = x;
  }
  mint &operator-=(const mint &rhs) {
    x -= rhs.x;
    if (x < 0) x += mod;
    return *this;
  }
  mint &operator+=(const mint &rhs) {
    x += rhs.x;
    if (x >= mod) x -= mod;
    return *this;
  }
  mint &operator*=(const mint &rhs) {
    x = (long long)x * rhs.x % mod;
    return *this;
  }
  mint &operator/=(const mint &rhs) {
    x = (long long)x * inv(rhs.x) % mod;
    return *this;
  }
  bool operator<(const mint &rhs) { return x < rhs.x; }
  bool operator==(const mint &rhs) { return x == rhs.x; }
  bool operator!=(const mint &rhs) { return x != rhs.x; }
  friend mint operator+(const mint &lhs, const mint &rhs) {
    mint ret(lhs);
    return ret += rhs;
  }
  friend mint operator-(const mint &lhs, const mint &rhs) {
    mint ret(lhs);
    return ret -= rhs;
  }
  friend mint operator*(const mint &lhs, const mint &rhs) {
    mint ret(lhs);
    return ret *= rhs;
  }
  friend mint operator/(const mint &lhs, const mint &rhs) {
    mint ret(lhs);
    return ret /= rhs;
  }
  friend ostream &operator<<(ostream &os, const mint &rhs) {
    os << rhs.x;
    return os;
  }
  friend istream &operator>>(istream &is, mint &rhs) {
    long long a;
    is >> a;
    rhs = a;
    return is;
  }
};
mint fpow(mint a, long long b) {
  mint r = 1;
  for (; b; b >>= 1) {
    if (b & 1) r = r * a;
    a = a * a;
  }
  return r;
}
const int N = 1e6 + 5;
mint pw[N];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  pw[0] = 1;
  for (int i = 1; i <= max(n, m); ++i) pw[i] = pw[i - 1] * 2;
  int f0 = 1, f1 = 1, cntx = n, cnty = m, fx = 0, fy = 0;
  vector<int> cnt(2);
  vector<vector<int>> cntr(n, vector<int>(2, 0)), cntc(m, vector<int>(2, 0));
  map<pair<int, int>, int> mp;
  auto Erase = [&](int x, int y) {
    if (!mp.count({x, y})) return;
    int p = mp[{x, y}];
    mp.erase({x, y});
    if (--cntr[x][p ^ y & 1] == 0) {
      if (cntr[x][p ^ y & 1 ^ 1])
        fx--;
      else
        cntx += 1;
    }
    if (--cntc[y][p ^ x & 1] == 0) {
      if (cntc[y][p ^ x & 1 ^ 1])
        fy--;
      else
        cnty += 1;
    }
    --cnt[x & 1 ^ y & 1 ^ p];
  };
  auto Insert = [&](int x, int y, int p) {
    mp[{x, y}] = p;
    if (cntr[x][p ^ y & 1]++ == 0) {
      if (cntr[x][p ^ y & 1 ^ 1])
        fx++;
      else
        cntx -= 1;
    }
    if (cntc[y][p ^ x & 1]++ == 0) {
      if (cntc[y][p ^ x & 1 ^ 1])
        fy++;
      else
        cnty -= 1;
    }
    ++cnt[x & 1 ^ y & 1 ^ p];
  };
  while (k--) {
    int x, y, op;
    cin >> x >> y >> op;
    --x, --y;
    Erase(x, y);
    if (op != -1) Insert(x, y, op);
    mint ans = -(cnt[0] == 0) - (cnt[1] == 0);
    if (fx == 0) ans += pw[cntx];
    if (fy == 0) ans += pw[cnty];
    cout << ans << '\n';
  }
}
