#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 10;
int n, m, k;
set<pair<int, int> > mp;
set<int> tp;
int cnt[maxn];
namespace Segtree {
int mx[maxn << 2], lz[maxn << 2];
void pushup(int o) { mx[o] = max(mx[o << 1], mx[o << 1 | 1]); }
void build(int o, int L, int R) {
  if (L == R) {
    mx[o] = L - n - 1;
    return;
  }
  int mid = (L + R) / 2;
  build(o << 1, L, mid);
  build(o << 1 | 1, mid + 1, R);
  pushup(o);
}
void pushdown(int o) {
  if (!lz[o]) return;
  mx[o << 1] += lz[o];
  mx[o << 1 | 1] += lz[o];
  lz[o << 1] += lz[o];
  lz[o << 1 | 1] += lz[o];
  lz[o] = 0;
}
void update(int o, int L, int R, int l, int r, int v) {
  if (l <= L && R <= r) {
    lz[o] += v;
    mx[o] += v;
    return;
  }
  pushdown(o);
  int mid = (L + R) / 2;
  if (l <= mid) update(o << 1, L, mid, l, r, v);
  if (r > mid) update(o << 1 | 1, mid + 1, R, l, r, v);
  pushup(o);
}
int query(int o, int L, int R, int l, int r) {
  if (l <= L && R <= r) {
    return max(0, mx[o]);
  }
  int mid = (L + R) / 2;
  pushdown(o);
  int ret = 0;
  if (l <= mid) ret = max(ret, query(o << 1, L, mid, l, r));
  if (r > mid) ret = max(ret, query(o << 1 | 1, mid + 1, R, l, r));
  pushup(o);
  return ret;
}
};  // namespace Segtree
using namespace Segtree;
int main() {
  scanf("%d%d%d", &n, &k, &m);
  build(1, 1, 2 * n);
  while (m--) {
    int x, y;
    scanf("%d%d", &x, &y);
    auto p = make_pair(x, y);
    int pos = y + abs(x - k);
    if (mp.count(p)) {
      mp.erase(p);
      --cnt[pos];
      if (!cnt[pos]) tp.erase(pos);
      update(1, 1, 2 * n, 1, pos, -1);
    } else {
      mp.insert(p);
      ++cnt[pos];
      tp.insert(pos);
      update(1, 1, 2 * n, 1, pos, 1);
    }
    if (tp.empty())
      printf("0\n");
    else
      printf("%d\n", query(1, 1, 2 * n, 1, *tp.rbegin()));
  }
  return 0;
}
