#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
const int maxh = 300001;
struct Thash {
  int hash[maxh];
  int next[maxn];
  int num[maxn];
  int key[maxn];
  int hs;
  void Init() {
    memset(hash, -1, sizeof(hash));
    hs = 0;
  }
  void Add(int x, int p) {
    int s = x % maxh;
    key[hs] = p;
    num[hs] = x;
    next[hs] = hash[s];
    hash[s] = hs++;
  }
  int Check(int x) {
    int s = x % maxh;
    for (int i = hash[s]; i != -1; i = next[i])
      if (num[i] == x) {
        num[i] = -1;
        return key[i];
      }
  }
} Set;
struct Tnode {
  int lt, rt;
  int lc, rc;
  int len, cnt;
} seg[maxn << 2];
int x[maxn], psn[maxn];
int root[maxn];
int vis[maxn];
int n, h, m, rs;
long long ret;
void build_tree(int t, int L, int r) {
  seg[t].lt = L, seg[t].rt = r, seg[t].len = r - L + 1, seg[t].cnt = seg[t].len;
  if (L == r) return;
  int mid = (L + r) >> 1;
  seg[t].lc = ++rs;
  build_tree(rs, L, mid);
  seg[t].rc = ++rs;
  build_tree(rs, mid + 1, r);
}
void prep() {
  int ls = 0;
  for (int i = 0; i < h; i++)
    if (!vis[i]) {
      int p = i;
      rs++;
      while (!vis[p]) {
        x[p] = ++ls;
        psn[ls] = p;
        root[p] = rs;
        vis[p] = 1;
        p = p + m;
        if (p >= h) p -= h;
      }
      build_tree(rs, x[i], ls);
    }
}
int seg_check(int t, int p) {
  if (!seg[t].cnt || seg[t].rt < p) return 0;
  if (seg[t].lt == seg[t].rt) {
    seg[t].cnt--;
    return seg[t].lt;
  }
  int u = seg_check(seg[t].lc, p);
  if (u) {
    seg[t].cnt--;
    return u;
  }
  u = seg_check(seg[t].rc, p);
  if (u) {
    seg[t].cnt--;
    return u;
  }
  return 0;
}
void Add() {
  int u, v;
  scanf("%d%d", &u, &v);
  int p = seg_check(root[v], x[v]);
  if (p) {
    ret += p - x[v];
    Set.Add(u, psn[p]);
  } else {
    p = seg_check(root[v], seg[root[v]].lt);
    ret += seg[root[v]].rt - x[v] + 1 + p - seg[root[v]].lt;
    Set.Add(u, psn[p]);
  }
}
void seg_del(int t, int p) {
  if (seg[t].lt == seg[t].rt) {
    seg[t].cnt++;
    return;
  }
  int lc = seg[t].lc, rc = seg[t].rc;
  seg[t].cnt++;
  if (p <= seg[lc].rt)
    seg_del(lc, p);
  else
    seg_del(rc, p);
}
void Del() {
  int u;
  scanf("%d", &u);
  int p = Set.Check(u);
  seg_del(root[p], x[p]);
}
void init() {
  scanf("%d%d%d", &h, &m, &n);
  char st[2];
  Set.Init();
  prep();
  for (int i = 1; i <= n; i++) {
    scanf("%s", st);
    if (st[0] == '+') Add();
    if (st[0] == '-') Del();
  }
}
void print() { printf("%I64d\n", ret); }
int main() {
  init();
  print();
  return 0;
}
