#include <bits/stdc++.h>
using namespace std;
struct ss {
  int next, to;
} e[100005 << 1];
int head[100005], cnt;
inline void add(int x, int y) {
  e[++cnt].next = head[x];
  e[cnt].to = y;
  head[x] = cnt;
}
bitset<1010> Map[1010], all_one;
int n, m, q, x[100005], y[100005], ans[100005], opt[100005], hang[100005],
    yh[100005];
inline void dfs(int pos) {
  bool flag = 0;
  if (opt[pos] == 1 && Map[x[pos]][y[pos]] == 0) {
    flag = 1;
    Map[x[pos]][y[pos]] = 1;
    cnt++;
  }
  if (opt[pos] == 2 && Map[x[pos]][y[pos]] == 1) {
    flag = 1;
    Map[x[pos]][y[pos]] = 0;
    cnt--;
  }
  if (opt[pos] == 3) {
    flag = 1;
    cnt -= Map[x[pos]].count();
    Map[x[pos]] ^= all_one;
    cnt += Map[x[pos]].count();
  }
  ans[pos] = cnt;
  for (int i = head[pos]; i; i = e[i].next) dfs(e[i].to);
  if (flag) {
    if (opt[pos] == 1) cnt--, Map[x[pos]][y[pos]] = 0;
    if (opt[pos] == 2) cnt++, Map[x[pos]][y[pos]] = 1;
    if (opt[pos] == 3) {
      cnt -= Map[x[pos]].count();
      Map[x[pos]] ^= all_one;
      cnt += Map[x[pos]].count();
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; i++) all_one.set(i);
  for (int i = 1; i <= q; i++) {
    scanf("%d", &opt[i]);
    if (opt[i] == 1) scanf("%d%d", &x[i], &y[i]), add(i - 1, i);
    if (opt[i] == 2) scanf("%d%d", &x[i], &y[i]), add(i - 1, i);
    if (opt[i] == 3) scanf("%d", &x[i]), add(i - 1, i);
    if (opt[i] == 4) scanf("%d", &x[i]), add(x[i], i);
  }
  cnt = 0;
  dfs(0);
  for (int i = 1; i <= q; i++) cout << ans[i], puts("");
}
