#include <bits/stdc++.h>
using namespace std;
const long double PI = acos(-1);
long long power(long long b, long long e, long long m) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b % m, e / 2, m) % m;
  return power(b * b % m, e / 2, m);
}
long long power(long long b, long long e) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b, e / 2);
  return power(b * b, e / 2);
}
template <typename T, typename U>
static inline void amin(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
static inline void amax(T &x, U y) {
  if (x < y) x = y;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  return os << '(' << p.first << "," << p.second << ')';
}
const int N = 400005;
struct node {
  long long sum;
} fake = {-2000000000000000000};
struct SEGTREE {
  long long a[N];
  SEGTREE() { memset(a, 0, sizeof(a)); }
  node tree[4 * N];
  long long lazy[4 * N];
  inline node combine(node a, node b) {
    node ret;
    ret.sum = max(a.sum, b.sum);
    return ret;
  }
  inline node make_node(long long val) {
    node ret;
    ret.sum = val;
    return ret;
  }
  inline void pushdown(long long v, long long st, long long en) {
    tree[v].sum += lazy[v];
    if (st != en) {
      lazy[v << 1] += lazy[v];
      lazy[v << 1 | 1] += lazy[v];
    }
    lazy[v] = 0;
    return;
  }
  void buildTree(long long v, long long st, long long en) {
    if (st == en) {
      tree[v] = make_node(a[st]);
      return;
    }
    long long mid = (st + en) >> 1;
    buildTree(v << 1, st, mid);
    buildTree(v << 1 | 1, mid + 1, en);
    tree[v] = combine(tree[v << 1], tree[v << 1 | 1]);
  }
  void rupdate(long long v, long long st, long long en, long long l,
               long long r, long long val) {
    if (lazy[v] != 0) {
      pushdown(v, st, en);
    }
    if (en < l || st > r) return;
    if (st >= l && en <= r) {
      lazy[v] = val;
      pushdown(v, st, en);
      return;
    }
    long long mid = (st + en) >> 1;
    rupdate(v << 1, st, mid, l, r, val);
    rupdate(v << 1 | 1, mid + 1, en, l, r, val);
    tree[v] = combine(tree[v << 1], tree[v << 1 | 1]);
  }
  node query(long long v, long long st, long long en, long long l,
             long long r) {
    if (en < l || st > r) return fake;
    if (lazy[v] != 0) {
      pushdown(v, st, en);
    }
    if (st >= l && en <= r) return tree[v];
    long long mid = (st + en) >> 1;
    return combine(query(v << 1, st, mid, l, r),
                   query(v << 1 | 1, mid + 1, en, l, r));
  }
} seg;
int _runtimeTerror_() {
  int n, k, m;
  cin >> n >> k >> m;
  set<pair<int, int>> s;
  map<int, int> lst;
  for (int i = 1; i <= 2 * n; ++i) seg.a[i] = i - 1;
  seg.buildTree(1, 1, 2 * n);
  for (int i = 0; i < m; ++i) {
    pair<int, int> p;
    cin >> p.first >> p.second;
    int x = abs(k - p.first) + p.second;
    if (s.count(p)) {
      seg.rupdate(1, 1, 2 * n, 1, x, -1);
      s.erase(p);
      lst[x]--;
      if (lst[x] == 0) lst.erase(x);
    } else {
      seg.rupdate(1, 1, 2 * n, 1, x, 1);
      s.insert(p);
      lst[x]++;
    }
    if (lst.empty())
      cout << 0 << '\n';
    else
      cout << max(seg.query(1, 1, 2 * n, 1, lst.rbegin()->first).sum - n, 0ll)
           << '\n';
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int TESTS = 1;
  while (TESTS--) _runtimeTerror_();
  return 0;
}
