#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for (int i = (a); i <= (b); ++i)
#define REPD(i,a,b) for (int i = (a); i >= (b); --i)
#define FORI(i,n) REP(i,1,n)
#define FOR(i,n) REP(i,0,int(n)-1)
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define ll long long
#define SZ(x) int((x).size())
#define DBG(v) cerr << #v << " = " << (v) << endl;
#define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++)
#define fi first
#define se second
const int N = 150100;
const int dx[5] = {0, 1, 0, -1, 0};
const int dy[5] = {1, 0, -1, 0, 1};
int n;
pii t[N], pt[N];
int id[N];
map<pii, int> lookup;
bool used[N];
int vis[N];
int neib[2][N];
int ans;
vector<pii> g[N];
void print_out() {
printf("%d\n", ans);
}
void dfs_out(int u) {
vis[u] = -1;
ans++;
FOR(i,SZ(g[u])) {
int v = g[u][i].fi, c = g[u][i].se;
if (!vis[v]) {
neib[c][v]--;
if (neib[c][v] == 0) {
dfs_out(v);
}
}
}
}
void queries(int lo) {
FOR(i,n) {
used[i] = 0;
vis[i] = 0;
neib[0][i] = neib[1][i] = 0;
g[i].clear();
}
ans = 0;
FOR(i,lo) used[id[i]] ^= 1;
FOR(i,n) if (used[i]) {
FOR(k,4) {
pii p = pt[i];
p.fi += dx[k];
p.se += dy[k];
if (lookup.find(p) != lookup.end()) {
int j = lookup[p];
if (used[j]) {
g[i].pb(mp(j,k&1));
neib[k&1][i]++;
}
}
}
}
/*FOR(u,n) {
printf("%d : ", u);
FOR(i,SZ(g[u])) {
printf("%c%d ", g[u][i].se==0?'-':'+', g[u][i].fi);
}
printf("\n");
}*/
FOR(u,n) if (used[u]) if (!vis[u]) {
if (neib[0][u] == 0 || neib[1][u] == 0) dfs_out(u);
}
printf("%d\n", ans);
}
int main() {
int nn,mm,k,q;
scanf("%d%d%d%d", &nn, &mm, &k, &q);
FOR(i,k+q) {
scanf("%d%d", &t[i].fi, &t[i].se);
if (lookup.find(t[i]) == lookup.end()) lookup[t[i]] = n++;
id[i] = lookup[t[i]];
pt[id[i]] = t[i];
}
FOR(i,q+1) queries(k+i);
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second const int N = 150100; const int dx[5] = {0, 1, 0, -1, 0}; const int dy[5] = {1, 0, -1, 0, 1}; int n; pii t[N], pt[N]; int id[N]; map<pii, int> lookup; bool used[N]; int vis[N]; int neib[2][N]; int ans; vector<pii> g[N]; void print_out() { printf("%d\n", ans); } void dfs_out(int u) { vis[u] = -1; ans++; FOR(i,SZ(g[u])) { int v = g[u][i].fi, c = g[u][i].se; if (!vis[v]) { neib[c][v]--; if (neib[c][v] == 0) { dfs_out(v); } } } } void queries(int lo) { FOR(i,n) { used[i] = 0; vis[i] = 0; neib[0][i] = neib[1][i] = 0; g[i].clear(); } ans = 0; FOR(i,lo) used[id[i]] ^= 1; FOR(i,n) if (used[i]) { FOR(k,4) { pii p = pt[i]; p.fi += dx[k]; p.se += dy[k]; if (lookup.find(p) != lookup.end()) { int j = lookup[p]; if (used[j]) { g[i].pb(mp(j,k&1)); neib[k&1][i]++; } } } } /*FOR(u,n) { printf("%d : ", u); FOR(i,SZ(g[u])) { printf("%c%d ", g[u][i].se==0?'-':'+', g[u][i].fi); } printf("\n"); }*/ FOR(u,n) if (used[u]) if (!vis[u]) { if (neib[0][u] == 0 || neib[1][u] == 0) dfs_out(u); } printf("%d\n", ans); } int main() { int nn,mm,k,q; scanf("%d%d%d%d", &nn, &mm, &k, &q); FOR(i,k+q) { scanf("%d%d", &t[i].fi, &t[i].se); if (lookup.find(t[i]) == lookup.end()) lookup[t[i]] = n++; id[i] = lookup[t[i]]; pt[id[i]] = t[i]; } FOR(i,q+1) queries(k+i); return 0; } |
English