1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cstdint>
#include <cstdio>
#include <set>
#include <vector>

struct PairCompareX {
  bool operator()(const std::pair<int, int>& a, const std::pair<int, int>& b) const { return (a.first < b.first) || (a.first == b.first && a.second < b.second); }
};
struct PairCompareY {
  bool operator()(const std::pair<int, int>& a, const std::pair<int, int>& b) const { return (a.second < b.second) || (a.second == b.second && a.first < b.first); }
};

using Brick = std::pair<int, int>;
using BoardX = std::set<Brick, PairCompareX>;
using BoardY = std::set<Brick, PairCompareY>;

bool sameX(const Brick& b1, const Brick& b2) { return b1.first == b2.first; }
bool sameY(const Brick& b1, const Brick& b2) { return b1.second == b2.second; }
bool nearX(const Brick& b1, const Brick& b2) { return b1.first + 1 == b2.first || b1.first == b2.first + 1; }
bool nearY(const Brick& b1, const Brick& b2) { return b1.second + 1 == b2.second || b1.second == b2.second + 1; }

int count(BoardX boardX, BoardY boardY) {
  int result = 0;
  bool removed = true;
  while (removed) {
    removed = false;
    for (auto it = boardX.begin(); it != boardX.end();) {
      auto itPrev = std::prev(it, 1);
      auto itNext = std::next(it, 1);
      if ((itPrev == boardX.end() || !sameX(*it, *itPrev) || !nearY(*it, *itPrev)) && (itNext == boardX.end() || !sameX(*it, *itNext) || !nearY(*it, *itNext))) {
        boardY.erase(*it);
        it = boardX.erase(it);
        result++;
        removed = true;
      } else {
        ++it;
      }
    }
    for (auto it = boardY.begin(); it != boardY.end();) {
      auto itPrev = std::prev(it, 1);
      auto itNext = std::next(it, 1);
      if ((itPrev == boardY.end() || !sameY(*it, *itPrev) || !nearX(*it, *itPrev)) && (itNext == boardY.end() || !sameY(*it, *itNext) || !nearX(*it, *itNext))) {
        boardX.erase(*it);
        it = boardY.erase(it);
        result++;
        removed = true;
      } else {
        ++it;
      }
    }
  }
  return result;
}

int main() {
  int n, m, k, q, x, y;
  scanf("%d %d %d %d", &n, &m, &k, &q);

  BoardX boardX;
  BoardY boardY;
  for (int i = 0; i < k; ++i) {
    scanf("%d %d", &x, &y);
    boardX.emplace(x, y);
    boardY.emplace(x, y);
  }

  printf("%d\n", count(boardX, boardY));
  for (int i = 0; i < q; ++i) {
    scanf("%d %d", &x, &y);
    auto it = boardX.find({x, y});
    if (it == boardX.end()) {
      boardX.emplace(x, y);
      boardY.emplace(x, y);
    } else {
      boardX.erase(it);
      boardY.erase({x, y});
    }
    printf("%d\n", count(boardX, boardY));
  }
  return 0;
}