#include <bits/stdc++.h>
using namespace std;
struct vect {
  int h, p1, p2;
};
struct point {
  int p1, p2;
};
int n, mod, nr, t;
long long solf;
int viz[200005];
point poz[200005];
map<int, vect> h;
vector<int> aib[200005];
void precalc() {
  int i, j, x;
  for (i = 0; i < n; i++)
    if (!viz[i]) {
      x = 1;
      j = i;
      nr++;
      do {
        viz[j] = nr;
        poz[j].p1 = x;
        x++;
        j = (j + mod) % n;
      } while (!viz[j]);
      j = i;
      do {
        poz[j].p2 = poz[j].p1 + x - 1;
        j = (j + mod) % n;
      } while (!poz[j].p2);
      for (j = 0; j <= 2 * x; j++) aib[nr].push_back(0);
    }
}
void update(int ind, int poz, int val) {
  while (poz < aib[ind].size()) {
    aib[ind][poz] += val;
    poz += poz & -poz;
  }
}
int query(int ind, int poz) {
  int sol = 0;
  while (poz > 0) {
    sol += aib[ind][poz];
    poz -= poz & -poz;
  }
  return sol;
}
int find(int x) {
  int st = poz[x].p1, dr = poz[x].p2, m, sol = dr - 1;
  int nr = st - query(viz[x], st);
  while (st <= dr) {
    m = (st + dr) >> 1;
    if (m - query(viz[x], m) > nr) {
      sol = m;
      dr = m - 1;
    } else
      st = m + 1;
  }
  solf += sol - poz[x].p1;
  sol = ((1LL * (sol - poz[x].p1) * mod) % n + x) % n;
  return sol;
}
int main() {
  scanf("%d %d %d\n", &n, &mod, &t);
  precalc();
  vect x;
  char ch;
  int id, hash, y, z;
  while (t--) {
    scanf("%c", &ch);
    if (ch == '-') {
      scanf("%d\n", &id);
      x = h[id];
      update(x.h, x.p1, -1);
      update(x.h, x.p2, -1);
      h[id] = (vect){0, 0, 0};
    } else {
      scanf("%d %d\n", &id, &hash);
      x.h = viz[hash];
      x.p1 = poz[hash].p1;
      x.p2 = poz[hash].p2;
      y = query(x.h, x.p1);
      z = query(x.h, x.p1 - 1);
      if (y != z) hash = find(hash);
      x.h = viz[hash];
      x.p1 = poz[hash].p1;
      x.p2 = poz[hash].p2;
      h[id] = x;
      update(x.h, x.p1, 1);
      update(x.h, x.p2, 1);
    }
  }
  printf("%I64d\n", solf);
  return 0;
}
