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
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include<bits/stdc++.h>
using namespace std;
map<pair<int, int>, int> odw, dobry;
int n, m, k, q, wyn;
set<pair<int, int>> S;
pair<int, int> ok[4] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};

void dfs(int x, int y)
{
    odw[{x, y}] = 1;
    //cout << x << " DFASDF " << y << '\n';
    if((!S.count({x + 1, y}) && !S.count({x - 1, y})) || (!S.count({x, y + 1}) && !S.count({x, y - 1})))
    {
        dobry[{x, y}] = 1;
        return;
    }

    if((S.count({x + 1, y}) && S.count({x - 1, y}) && dobry[{x + 1, y}] && dobry[{x - 1, y}]) || 
    (S.count({x + 1, y}) && !S.count({x - 1, y}) && dobry[{x + 1, y}]) || 
    (!S.count({x + 1, y}) && S.count({x - 1, y}) && dobry[{x - 1, y}]))
    {
        dobry[{x, y}] = 1;
        return;
    }

    if((S.count({x, y + 1}) && S.count({x, y - 1}) && dobry[{x, y + 1}] && dobry[{x, y - 1}]) || 
    (S.count({x, y + 1}) && !S.count({x, y - 1}) && dobry[{x, y + 1}]) || 
    (!S.count({x, y + 1}) && S.count({x, y - 1}) && dobry[{x, y - 1}]))
    {
        dobry[{x, y}] = 1;
        return;
    }

    for(int i = 0; i < 4; i++)
        if(S.count({x + ok[i].first, y + ok[i].second}) && !odw[{x + ok[i].first, y + ok[i].second}])
            dfs(x + ok[i].first, y + ok[i].second);

    if((S.count({x + 1, y}) && S.count({x - 1, y}) && dobry[{x + 1, y}] && dobry[{x - 1, y}]) || 
    (S.count({x + 1, y}) && !S.count({x - 1, y}) && dobry[{x + 1, y}]) || 
    (!S.count({x + 1, y}) && S.count({x - 1, y}) && dobry[{x - 1, y}]))
    {
        dobry[{x, y}] = 1;
        return;
    }

    if((S.count({x, y + 1}) && S.count({x, y - 1}) && dobry[{x, y + 1}] && dobry[{x, y - 1}]) || 
    (S.count({x, y + 1}) && !S.count({x, y - 1}) && dobry[{x, y + 1}]) || 
    (!S.count({x, y + 1}) && S.count({x, y - 1}) && dobry[{x, y - 1}]))
    {
        dobry[{x, y}] = 1;
        return;
    }
    //cout << x << " UBASFD " << y << "\n";
    dobry[{x, y}] = 0;
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m >> k >> q;
    for(int i = 0; i < k; i++)
    {
        int a, b; cin >> a >> b;
        odw[{a, b}] = 0;
        dobry[{a, b}] = 0;
        S.insert({a, b});
    }

    for(auto v : S)
        if(!odw[{v.first, v.second}])
            dfs(v.first, v.second);

    for(auto v : S)
        if(dobry[{v.first, v.second}])
            wyn++;;

    cout << wyn << "\n";
    while(q--)
    {
        int a, b; cin >> a >> b;
        wyn = 0;
        if(S.count({a, b})) //usu
        {
            for(auto v : S) 
            {
                odw[{v.first, v.second}] = 0;
                dobry[{v.first, v.second}] = 0;
            }
            S.erase({a, b});

            for(auto v : S)
                if(!odw[{v.first, v.second}])
                    dfs(v.first, v.second);
        }
        else //dodac
        {
            S.insert({a, b});
            for(auto v : S) 
            {
                odw[{v.first, v.second}] = 0;
                dobry[{v.first, v.second}] = 0;
            }

            for(auto v : S)
                if(!odw[{v.first, v.second}])
                    dfs(v.first, v.second);
        }

        for(auto v : S)
            if(dobry[{v.first, v.second}])
                wyn++;

        cout << wyn << "\n";
    }
}

/*
5 5 12 1
3 3
2 2
1 5
5 2
4 1
4 3
5 5
4 2
4 4
2 1
3 2
3 4

1 1

*/