#include <bits/stdc++.h>
using namespace std;
set<int> H, V;
int lazy[800100][2];
int tree[800100][2];
void update(int x, int y, int val, int node, int left, int right, int k) {
  if (y < x || right < left) return;
  if (lazy[node][k] != 0) {
    tree[node][k] = lazy[node][k];
    if (left != right) {
      lazy[node << 1][k] = lazy[node][k];
      lazy[(node << 1) + 1][k] = lazy[node][k];
    }
    lazy[node][k] = 0;
  }
  if (right < x || y < left) return;
  if (x <= left && right <= y) {
    tree[node][k] = val;
    if (left != right) {
      lazy[node << 1][k] = val;
      lazy[(node << 1) + 1][k] = val;
    }
    return;
  }
  int mid = (left + right) / 2;
  update(x, y, val, node << 1, left, mid, k);
  update(x, y, val, (node << 1) + 1, mid + 1, right, k);
  tree[node][k] = max(tree[node << 1][k], tree[(node << 1) + 1][k]);
  return;
}
int getMax(int x, int y, int node, int left, int right, int k) {
  if (y < x || right < left) return 0;
  if (lazy[node][k] != 0) {
    tree[node][k] = lazy[node][k];
    if (left != right) {
      lazy[node << 1][k] = lazy[node][k];
      lazy[(node << 1) + 1][k] = lazy[node][k];
    }
    lazy[node][k] = 0;
  }
  if (right < x || y < left) return 0;
  if (x <= left && right <= y) {
    return tree[node][k];
  }
  int mid = (left + right) / 2;
  int ans1 = getMax(x, y, node << 1, left, mid, k);
  int ans2 = getMax(x, y, (node << 1) + 1, mid + 1, right, k);
  return max(ans1, ans2);
}
int main() {
  ios::sync_with_stdio(false);
  int n, w, h;
  cin >> w >> h >> n;
  H.insert(-1);
  H.insert(h - 1);
  V.insert(-1);
  V.insert(w - 1);
  update(0, w - 1, w, 1, 0, w - 1, 1);
  update(0, h - 1, h, 1, 0, h - 1, 0);
  for (int i = 0; i < n; i++) {
    char dir;
    int x;
    cin >> dir >> x;
    --x;
    if (dir == 'H') {
      set<int>::iterator it = H.lower_bound(x);
      it--;
      int low = *it;
      int up = *H.upper_bound(x);
      update(low + 1, x, (x - low), 1, 0, h - 1, 0);
      update(x + 1, up, (up - x), 1, 0, h - 1, 0);
      H.insert(x);
    } else {
      set<int>::iterator it = V.lower_bound(x);
      it--;
      int low = *it;
      int up = *V.upper_bound(x);
      update(low + 1, x, (x - low), 1, 0, w - 1, 1);
      update(x + 1, up, (up - x), 1, 0, w - 1, 1);
      V.insert(x);
    }
    long long width = getMax(0, w - 1, 1, 0, w - 1, 1);
    long long height = getMax(0, h - 1, 1, 0, h - 1, 0);
    cout << width * height << endl;
  }
  return 0;
}
