#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500100, MAXK = 20;
const long long MOD = 1e9 + 7;
const long long INF = 1e16;
const long double PI = asin(1) * 2;
void setIO() {
  ios_base::sync_with_stdio(0);
  cin.tie(nullptr);
}
void setIO(string second) {
  setIO();
  freopen((second + ".in").c_str(), "r", stdin);
  freopen((second + ".out").c_str(), "w", stdout);
}
int n, k, m;
int tree[4 * MAXN], lazy[4 * MAXN];
void shift(int id) {
  tree[2 * id] += lazy[id];
  tree[2 * id + 1] += lazy[id];
  lazy[2 * id] += lazy[id];
  lazy[2 * id + 1] += lazy[id];
  lazy[id] = 0;
}
void upd(int x, int y, int d, int id = 1, int le = 1, int ri = n) {
  if (x > ri || y < le) return;
  if (x <= le && ri <= y) {
    tree[id] += d;
    lazy[id] += d;
    return;
  }
  if (le < ri) shift(id);
  int mid = (le + ri) / 2;
  upd(x, y, d, 2 * id, le, mid);
  upd(x, y, d, 2 * id + 1, mid + 1, ri);
  tree[id] = max(tree[2 * id], tree[2 * id + 1]);
}
int get(int x, int y, int id = 1, int le = 1, int ri = n) {
  if (x > ri || y < le) return 0;
  if (x <= le && ri <= y) return tree[id];
  if (le < ri) shift(id);
  int mid = (le + ri) / 2;
  return max(get(x, y, 2 * id, le, mid), get(x, y, 2 * id + 1, mid + 1, ri));
}
set<pair<int, int> > cur;
map<int, int> cnt;
set<int> pos;
int getAns() {
  if ((int)pos.size() == 0) return 0;
  int bg = (*(pos.rbegin()));
  int ans = get(1, bg);
  ans = max(0, ans - n / 2);
  return ans;
}
int main() {
  setIO();
  cin >> n >> k >> m;
  n *= 2;
  for (int i = (1); i <= (n); i++) upd(i, i, i - 1);
  for (int O = (1); O <= ((m)); O++) {
    int x, y;
    cin >> x >> y;
    int nY = y + abs(k - x);
    if (cur.count({x, y})) {
      upd(1, nY, -1);
      cnt[nY]--;
      if (cnt[nY] == 0) pos.erase(nY);
      cur.erase({x, y});
    } else {
      upd(1, nY, 1);
      cnt[nY]++;
      pos.insert(nY);
      cur.insert({x, y});
    }
    cout << getAns() << "\n";
  }
  return 0;
}
