#include <bits/stdc++.h>
using namespace std;
#define FOR(i,p,q) for(int i=(p); i<=(q); ++i)
#define ROF(i,p,q) for(int i=(p); i>=(q); --i)
#define REP(i,q) for(int i=0; i<(q); ++i)
#define pb push_back
#define as assign
#define rz resize
#define Co const
#define all(X) X.begin(), X.end()
#define rall(X) X.rbegin(), X.rend()
#define sz(X) (int)(X.size())
#define ckmax(a,b) a=max(a,b)
#define ckmin(a,b) a=min(a,b)
#define V vector
typedef long long ll;
typedef mt19937_64 mt;
#ifndef UNCLE
typedef basic_string<bool> vb;
typedef basic_string<int> vi;
typedef basic_string<ll> vl;
#else
typedef V<bool> vb;
typedef V<int> vi;
typedef V<ll> vl;
#endif
constexpr int MX_R=2e5+3,MX_C=2e5+3, MX_N=75e3+3,MX_Q=75e3+3, MX_M=MX_N+MX_Q;
int R,C,N,Q, M=0, res=0;
unordered_map<ll,int> ids;
struct EL{bool isOn; int up,rg,dw,lf;};
V<EL> els(MX_M,{0,0,0,0,0});
vi tmp;
void Dfs(int v){//zakladam ze isOn
if(!els[els[v].up].isOn&&!els[els[v].dw].isOn){
els[v].isOn=0,++res,tmp.pb(v);
if(els[v].lf&&els[els[v].lf].isOn) Dfs(els[v].lf);
if(els[v].rg&&els[els[v].rg].isOn) Dfs(els[v].rg);
}else if(!els[els[v].lf].isOn&&!els[els[v].rg].isOn){
els[v].isOn=0,++res,tmp.pb(v);
if(els[v].up&&els[els[v].up].isOn) Dfs(els[v].up);
if(els[v].dw&&els[els[v].dw].isOn) Dfs(els[v].dw);
}
}
void Solv(){
res=0;
FOR(i,1,M) if(els[i].isOn) Dfs(i);
while(!tmp.empty()) els[tmp.back()].isOn=1,tmp.pop_back();
cout<<res<<"\n";
}
void Input(){
cin>>R>>C>>N>>Q,R+=2,C+=2;
ll r,c;
auto Upt=[](Co ll v){
if(ids.count(v)){//usuwanie
els[ids[v]]={0,-1,-1,-1,-1}, ids.erase(v);
if(ids.count(v-C)) els[ids[v-C]].dw=0;
if(ids.count(v+1)) els[ids[v+1]].lf=0;
if(ids.count(v+C)) els[ids[v+C]].up=0;
if(ids.count(v-1)) els[ids[v-1]].rg=0;
}else{
ids[v]=++M, els[M].isOn=1;
if(ids.count(v-C)) els[ids[v-C]].dw=M, els[M].up=ids[v-C];
if(ids.count(v+1)) els[ids[v+1]].lf=M, els[M].rg=ids[v+1];
if(ids.count(v+C)) els[ids[v+C]].up=M, els[M].dw=ids[v+C];
if(ids.count(v-1)) els[ids[v-1]].rg=M, els[M].lf=ids[v-1];
}
};
REP(_,N){
cin>>r>>c;
Upt(r*C+c);
}
Solv();
REP(_,Q){
cin>>r>>c;
Upt(r*C+c);
Solv();
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
Input();
}
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 | #include <bits/stdc++.h> using namespace std; #define FOR(i,p,q) for(int i=(p); i<=(q); ++i) #define ROF(i,p,q) for(int i=(p); i>=(q); --i) #define REP(i,q) for(int i=0; i<(q); ++i) #define pb push_back #define as assign #define rz resize #define Co const #define all(X) X.begin(), X.end() #define rall(X) X.rbegin(), X.rend() #define sz(X) (int)(X.size()) #define ckmax(a,b) a=max(a,b) #define ckmin(a,b) a=min(a,b) #define V vector typedef long long ll; typedef mt19937_64 mt; #ifndef UNCLE typedef basic_string<bool> vb; typedef basic_string<int> vi; typedef basic_string<ll> vl; #else typedef V<bool> vb; typedef V<int> vi; typedef V<ll> vl; #endif constexpr int MX_R=2e5+3,MX_C=2e5+3, MX_N=75e3+3,MX_Q=75e3+3, MX_M=MX_N+MX_Q; int R,C,N,Q, M=0, res=0; unordered_map<ll,int> ids; struct EL{bool isOn; int up,rg,dw,lf;}; V<EL> els(MX_M,{0,0,0,0,0}); vi tmp; void Dfs(int v){//zakladam ze isOn if(!els[els[v].up].isOn&&!els[els[v].dw].isOn){ els[v].isOn=0,++res,tmp.pb(v); if(els[v].lf&&els[els[v].lf].isOn) Dfs(els[v].lf); if(els[v].rg&&els[els[v].rg].isOn) Dfs(els[v].rg); }else if(!els[els[v].lf].isOn&&!els[els[v].rg].isOn){ els[v].isOn=0,++res,tmp.pb(v); if(els[v].up&&els[els[v].up].isOn) Dfs(els[v].up); if(els[v].dw&&els[els[v].dw].isOn) Dfs(els[v].dw); } } void Solv(){ res=0; FOR(i,1,M) if(els[i].isOn) Dfs(i); while(!tmp.empty()) els[tmp.back()].isOn=1,tmp.pop_back(); cout<<res<<"\n"; } void Input(){ cin>>R>>C>>N>>Q,R+=2,C+=2; ll r,c; auto Upt=[](Co ll v){ if(ids.count(v)){//usuwanie els[ids[v]]={0,-1,-1,-1,-1}, ids.erase(v); if(ids.count(v-C)) els[ids[v-C]].dw=0; if(ids.count(v+1)) els[ids[v+1]].lf=0; if(ids.count(v+C)) els[ids[v+C]].up=0; if(ids.count(v-1)) els[ids[v-1]].rg=0; }else{ ids[v]=++M, els[M].isOn=1; if(ids.count(v-C)) els[ids[v-C]].dw=M, els[M].up=ids[v-C]; if(ids.count(v+1)) els[ids[v+1]].lf=M, els[M].rg=ids[v+1]; if(ids.count(v+C)) els[ids[v+C]].up=M, els[M].dw=ids[v+C]; if(ids.count(v-1)) els[ids[v-1]].rg=M, els[M].lf=ids[v-1]; } }; REP(_,N){ cin>>r>>c; Upt(r*C+c); } Solv(); REP(_,Q){ cin>>r>>c; Upt(r*C+c); Solv(); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); Input(); } |
English