#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
set<pair<long long, long long> > vis;
struct node {
  long long ma = 0;
  long long add = 0;
};
vector<node> s(1 << 21);
long long dim = 1 << 20;
long long sx(long long p) { return p * 2; }
long long dx(long long p) { return p * 2 + 1; }
void upd(long long pos, long long l, long long r, long long a, long long b,
         long long val) {
  if (a <= l && r <= b) s[pos].add += val;
  if (s[pos].add) {
    if (pos < dim) {
      s[sx(pos)].add += s[pos].add;
      s[dx(pos)].add += s[pos].add;
    }
    s[pos].ma += s[pos].add;
    s[pos].add = 0;
  }
  if (b < l || r < a) return;
  if (a <= l && r <= b) return;
  upd(sx(pos), l, (l + r) / 2, a, b, val);
  upd(dx(pos), (l + r) / 2 + 1, r, a, b, val);
  s[pos].ma = max(s[sx(pos)].ma, s[dx(pos)].ma);
}
long long query(long long pos, long long l, long long r, long long a,
                long long b) {
  if (s[pos].add) {
    if (pos < dim) {
      s[sx(pos)].add += s[pos].add;
      s[dx(pos)].add += s[pos].add;
    }
    s[pos].ma += s[pos].add;
    s[pos].add = 0;
  }
  if (b < l || r < a) return 0;
  if (a <= l && r <= b) return s[pos].ma;
  return max(query(sx(pos), l, (l + r) / 2, a, b),
             query(dx(pos), (l + r) / 2 + 1, r, a, b));
}
multiset<long long> v;
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long N, M, K;
  cin >> N >> K >> M;
  for (long long i = 1; i <= 2 * N; i++) upd(1, 0, dim - 1, i, i, i);
  for (long long i = 0; i < M; i++) {
    long long a, b;
    cin >> a >> b;
    long long pos = b + abs(a - K);
    if (vis.find({a, b}) != vis.end()) {
      vis.erase({a, b});
      v.erase(v.find(-pos));
      upd(1, 0, dim - 1, 0, pos, -1);
    } else {
      vis.insert({a, b});
      v.insert(-pos);
      upd(1, 0, dim - 1, 0, pos, 1);
    }
    cout << max((long long)0, query(1, 0, dim - 1, 0, -(*v.begin())) - N - 1)
         << '\n';
  }
}
