#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
const int K = 4e5;
const int INF = 1 << 30;
map<pair<int, int>, int> mp;
int n, k, m;
int mx[N << 2], lazy[N << 2];
void push_up(int rt) { mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]); }
void push_down(int rt) {
  if (lazy[rt]) {
    mx[rt << 1] += lazy[rt];
    mx[rt << 1 | 1] += lazy[rt];
    lazy[rt << 1] += lazy[rt];
    lazy[rt << 1 | 1] += lazy[rt];
    lazy[rt] = 0;
  }
}
void build(int l, int r, int rt) {
  if (l == r) {
    mx[rt] = l - n - 1;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, rt << 1);
  build(mid + 1, r, rt << 1 | 1);
  push_up(rt);
}
void update(int y, int z, int l, int r, int rt) {
  if (r <= y) {
    mx[rt] += z;
    lazy[rt] += z;
    return;
  }
  push_down(rt);
  int mid = (l + r) >> 1;
  update(y, z, l, mid, rt << 1);
  if (y > mid) update(y, z, mid + 1, r, rt << 1 | 1);
  push_up(rt);
}
int query(int y, int l, int r, int rt) {
  if (r <= y) {
    return mx[rt];
  }
  push_down(rt);
  int mid = (l + r) >> 1;
  int ans = query(y, l, mid, rt << 1);
  if (y > mid) ans = max(ans, query(y, mid + 1, r, rt << 1 | 1));
  return ans;
}
multiset<int> st;
int main() {
  scanf("%d%d%d", &n, &k, &m);
  build(1, K, 1);
  st.insert(n);
  while (m--) {
    int x, y;
    scanf("%d%d", &x, &y);
    pair<int, int> p = make_pair(x, y);
    int lim = y + abs(k - x);
    if (mp[p] == 0) {
      update(lim, 1, 1, K, 1);
      mp[p] = 1;
      st.insert(lim);
    } else {
      update(lim, -1, 1, K, 1);
      mp[p] = 0;
      st.erase(st.lower_bound(lim));
    }
    printf("%d\n", max(0, query(*st.rbegin(), 1, K, 1)));
  }
  return 0;
}
