#include <bits/stdc++.h> using namespace std; int n,m,k,q,b,i,x,y,z,sx,sy,ex,ey,j; set <array<int,2>> xy; set <array<int,3>> xys; array<int,3> aa,bb,cc; array<int,2> dd; set <array<int,2>> LU, LD,RU,RD; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k >> q; z=0; for(i=0;i<k;i++) { cin >> x >> y; xy.insert({x,y}); } for (j=0;j<=q;j++) { z=0; if(j>0) { xys={}; LU={}; RU={}; LD={}; RD={}; cin >> x >> y; if(xy.find({x,y})!=xy.end()) xy.erase({x,y}); else xy.insert({x,y}); } for(auto it : xy) { //if(j==2214) // cout << it[0] << ' ' << it[1] << "H\n"; b=0; if(xy.find({it[0]+1,it[1]})!=xy.end()) b|=1; if(xy.find({it[0]-1,it[1]})!=xy.end()) b|=2; if(xy.find({it[0],it[1]+1})!=xy.end()) b|=4; if(xy.find({it[0],it[1]-1})!=xy.end()) b|=8; if(b==5 || b==10) b|=16; else if(b==6 || b==9) b|=32; else if(b==7 and (xy.find({it[0]+1,it[1]+1})!=xy.end() or xy.find({it[0]-1,it[1]+1})!=xy.end())) b|=64; else if(b==11 and (xy.find({it[0]+1,it[1]-1})!=xy.end() or xy.find({it[0]-1,it[1]-1})!=xy.end())) b|=64; else if(b==13 and (xy.find({it[0]+1,it[1]+1})!=xy.end() or xy.find({it[0]+1,it[1]-1})!=xy.end())) b|=64; else if(b==14 and (xy.find({it[0]-1,it[1]+1})!=xy.end() or xy.find({it[0]-1,it[1]-1})!=xy.end())) b|=64; else if(b==15 and (xy.find({it[0]-1,it[1]+1})!=xy.end() or xy.find({it[0]-1,it[1]-1})!=xy.end() or xy.find({it[0]+1,it[1]+1})!=xy.end() or xy.find({it[0]+1,it[1]-1})!=xy.end())) b|=64; xys.insert({it[0],it[1],b}); } for(auto it : xys) { if((it[2]&15)==5) { aa=*xys.lower_bound({it[0]+1,it[1],0}); if((aa[2]&15)!=10) RU.insert({it[0]+1+it[1],-2*it[1]}); aa=*xys.lower_bound({it[0],it[1]+1,0}); if((aa[2]&15)!=10) LD.insert({it[0]+it[1]+1,2*(it[1]+1)}); } if((it[2]&15)==10) { aa=*xys.lower_bound({it[0],it[1]-1,0}); if((aa[2]&15)!=5) RU.insert({it[0]+it[1],-(2*it[1]-1)}); aa=*xys.lower_bound({it[0]-1,it[1],0}); if((aa[2]&15)!=5) LD.insert({it[0]+it[1],(2*it[1]+1)}); } if((it[2]&15)==6) { aa=*xys.lower_bound({it[0]-1,it[1],0}); if((aa[2]&15)!=9) LU.insert({it[0]-1-it[1],-2*it[1]}); aa=*xys.lower_bound({it[0],it[1]+1,0}); if((aa[2]&15)!=9) RD.insert({it[0]-1-it[1],2*(it[1]+1)}); } if((it[2]&15)==9) { aa=*xys.lower_bound({it[0],it[1]-1,0}); if((aa[2]&15)!=6) LU.insert({it[0]-it[1],-(2*it[1]-1)}); aa=*xys.lower_bound({it[0]+1,it[1],0}); if((aa[2]&15)!=6) RD.insert({it[0]-it[1],(2*it[1]+1)}); } } for(auto it : xys) { if(it[2]<16) {z++; //cout << it[0] << ' ' << it[1] << "P\n"; } if((it[2]&15)==5) { //cout << it[0] << ' ' << it[1] << "LU\n"; } } for(auto tt: LU) { //cout << tt[0] << ' ' << tt[1] << "G\n"; dd=*RD.upper_bound({tt[0],-tt[1]}); //cout << dd[0] << ' ' << dd[1] << "H\n"; if(tt[1]%2) { sy=(1-tt[1])/2-1; sx=tt[0]+sy+1; } else { sy=-tt[1]/2; sx=tt[0]+sy; } if(dd[1]%2) { ey=(1+dd[1])/2-1; ex=dd[0]+ey+1; } else { ey=dd[1]/2; ex=dd[0]+ey; } bb=*xys.lower_bound({sx,sy,0}); cc=*xys.lower_bound({ex,ey,0}); if(bb[2]<16 or cc[2]<16) { z+=dd[1]+tt[1]-1; //cout << bb[0] << ' ' << bb[1] << ' ' << (bb[2]&15) << "HP\n"; //cout << sx << ' ' << sy << "HP\n"; //cout << cc[0] << ' ' << cc[1] << ' ' << (cc[2]&15) << "HP\n"; //cout << ex << ' ' << ey << "HP\n"; } } for(auto tt: RU) { //cout << tt[0] << ' ' << tt[1] << "Gx\n"; dd=*LD.upper_bound({tt[0],-tt[1]}); //cout << dd[0] << ' ' << dd[1] << "Hx\n"; if(tt[1]%2) { sy=(1-tt[1])/2-1; sx=tt[0]-sy-1; } else { sy=-tt[1]/2; sx=tt[0]-sy; } if(dd[1]%2) { ey=(1+dd[1])/2-1; ex=dd[0]-ey-1; } else { ey=dd[1]/2; ex=dd[0]-ey; } bb=*xys.lower_bound({sx,sy,0}); cc=*xys.lower_bound({ex,ey,0}); //cout << bb[0] << ' ' << bb[1] << ' ' << (bb[2]&15) << "HP\n"; //cout << sx << ' ' << sy << "HP\n"; //cout << cc[0] << ' ' << cc[1] << ' ' << (cc[2]&15) << "HP\n"; //cout << ex << ' ' << ey << "HP\n"; if(bb[2]<16 or cc[2]<16){ z+=dd[1]+tt[1]-1; //cout << bb[0] << ' ' << bb[1] << "HP\n"; //cout << sx << ' ' << sy << "HP\n"; } } cout << z << '\n'; } }
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | #include <bits/stdc++.h> using namespace std; int n,m,k,q,b,i,x,y,z,sx,sy,ex,ey,j; set <array<int,2>> xy; set <array<int,3>> xys; array<int,3> aa,bb,cc; array<int,2> dd; set <array<int,2>> LU, LD,RU,RD; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k >> q; z=0; for(i=0;i<k;i++) { cin >> x >> y; xy.insert({x,y}); } for (j=0;j<=q;j++) { z=0; if(j>0) { xys={}; LU={}; RU={}; LD={}; RD={}; cin >> x >> y; if(xy.find({x,y})!=xy.end()) xy.erase({x,y}); else xy.insert({x,y}); } for(auto it : xy) { //if(j==2214) // cout << it[0] << ' ' << it[1] << "H\n"; b=0; if(xy.find({it[0]+1,it[1]})!=xy.end()) b|=1; if(xy.find({it[0]-1,it[1]})!=xy.end()) b|=2; if(xy.find({it[0],it[1]+1})!=xy.end()) b|=4; if(xy.find({it[0],it[1]-1})!=xy.end()) b|=8; if(b==5 || b==10) b|=16; else if(b==6 || b==9) b|=32; else if(b==7 and (xy.find({it[0]+1,it[1]+1})!=xy.end() or xy.find({it[0]-1,it[1]+1})!=xy.end())) b|=64; else if(b==11 and (xy.find({it[0]+1,it[1]-1})!=xy.end() or xy.find({it[0]-1,it[1]-1})!=xy.end())) b|=64; else if(b==13 and (xy.find({it[0]+1,it[1]+1})!=xy.end() or xy.find({it[0]+1,it[1]-1})!=xy.end())) b|=64; else if(b==14 and (xy.find({it[0]-1,it[1]+1})!=xy.end() or xy.find({it[0]-1,it[1]-1})!=xy.end())) b|=64; else if(b==15 and (xy.find({it[0]-1,it[1]+1})!=xy.end() or xy.find({it[0]-1,it[1]-1})!=xy.end() or xy.find({it[0]+1,it[1]+1})!=xy.end() or xy.find({it[0]+1,it[1]-1})!=xy.end())) b|=64; xys.insert({it[0],it[1],b}); } for(auto it : xys) { if((it[2]&15)==5) { aa=*xys.lower_bound({it[0]+1,it[1],0}); if((aa[2]&15)!=10) RU.insert({it[0]+1+it[1],-2*it[1]}); aa=*xys.lower_bound({it[0],it[1]+1,0}); if((aa[2]&15)!=10) LD.insert({it[0]+it[1]+1,2*(it[1]+1)}); } if((it[2]&15)==10) { aa=*xys.lower_bound({it[0],it[1]-1,0}); if((aa[2]&15)!=5) RU.insert({it[0]+it[1],-(2*it[1]-1)}); aa=*xys.lower_bound({it[0]-1,it[1],0}); if((aa[2]&15)!=5) LD.insert({it[0]+it[1],(2*it[1]+1)}); } if((it[2]&15)==6) { aa=*xys.lower_bound({it[0]-1,it[1],0}); if((aa[2]&15)!=9) LU.insert({it[0]-1-it[1],-2*it[1]}); aa=*xys.lower_bound({it[0],it[1]+1,0}); if((aa[2]&15)!=9) RD.insert({it[0]-1-it[1],2*(it[1]+1)}); } if((it[2]&15)==9) { aa=*xys.lower_bound({it[0],it[1]-1,0}); if((aa[2]&15)!=6) LU.insert({it[0]-it[1],-(2*it[1]-1)}); aa=*xys.lower_bound({it[0]+1,it[1],0}); if((aa[2]&15)!=6) RD.insert({it[0]-it[1],(2*it[1]+1)}); } } for(auto it : xys) { if(it[2]<16) {z++; //cout << it[0] << ' ' << it[1] << "P\n"; } if((it[2]&15)==5) { //cout << it[0] << ' ' << it[1] << "LU\n"; } } for(auto tt: LU) { //cout << tt[0] << ' ' << tt[1] << "G\n"; dd=*RD.upper_bound({tt[0],-tt[1]}); //cout << dd[0] << ' ' << dd[1] << "H\n"; if(tt[1]%2) { sy=(1-tt[1])/2-1; sx=tt[0]+sy+1; } else { sy=-tt[1]/2; sx=tt[0]+sy; } if(dd[1]%2) { ey=(1+dd[1])/2-1; ex=dd[0]+ey+1; } else { ey=dd[1]/2; ex=dd[0]+ey; } bb=*xys.lower_bound({sx,sy,0}); cc=*xys.lower_bound({ex,ey,0}); if(bb[2]<16 or cc[2]<16) { z+=dd[1]+tt[1]-1; //cout << bb[0] << ' ' << bb[1] << ' ' << (bb[2]&15) << "HP\n"; //cout << sx << ' ' << sy << "HP\n"; //cout << cc[0] << ' ' << cc[1] << ' ' << (cc[2]&15) << "HP\n"; //cout << ex << ' ' << ey << "HP\n"; } } for(auto tt: RU) { //cout << tt[0] << ' ' << tt[1] << "Gx\n"; dd=*LD.upper_bound({tt[0],-tt[1]}); //cout << dd[0] << ' ' << dd[1] << "Hx\n"; if(tt[1]%2) { sy=(1-tt[1])/2-1; sx=tt[0]-sy-1; } else { sy=-tt[1]/2; sx=tt[0]-sy; } if(dd[1]%2) { ey=(1+dd[1])/2-1; ex=dd[0]-ey-1; } else { ey=dd[1]/2; ex=dd[0]-ey; } bb=*xys.lower_bound({sx,sy,0}); cc=*xys.lower_bound({ex,ey,0}); //cout << bb[0] << ' ' << bb[1] << ' ' << (bb[2]&15) << "HP\n"; //cout << sx << ' ' << sy << "HP\n"; //cout << cc[0] << ' ' << cc[1] << ' ' << (cc[2]&15) << "HP\n"; //cout << ex << ' ' << ey << "HP\n"; if(bb[2]<16 or cc[2]<16){ z+=dd[1]+tt[1]-1; //cout << bb[0] << ' ' << bb[1] << "HP\n"; //cout << sx << ' ' << sy << "HP\n"; } } cout << z << '\n'; } } |