#include <bits/stdc++.h> using namespace std; int wartosc[150002]; pair<int, int > wsp[150002]; map<long long,int> numery; set<long long> sa; queue<pair<int,int> > kolejka; bool dobra_wartosc(int i){ return (wartosc[i]== 11 || wartosc[i]== 8 || wartosc[i]== 1 || wartosc[i]== 3 || wartosc[i]== 5 ||wartosc[i]== 10 ||wartosc[i]== 0); } int main() { ios_base::sync_with_stdio(0); int i, j, q, n, k, m, x, y, wyn = 0; long long l, p, g, d; cin >> n >> m >> k >> q; for(i = 1; i <= k; i++){ cin >> x >> y; wsp[i].first = x; wsp[i].second = y; numery[(x-1)*m + y] = i; sa.insert((long long)(x-1)*m + y); } //for(set<long long>::iterator it= sa.begin(); it!=sa.end();it++) cout << *it <<" ";cout << endl; //for(i = 1; i <= k; i++) cout << klocki[i] <<" ";cout << endl; for(i = 1; i <= k; i++){ x = wsp[i].first; y = wsp[i].second;//2 1 l = (x-1)*m + y-1;//2 0 g = (x-2)*m + y; p = (x-1)*m + y + 1; d = x * m + y; //cout << x <<" " <<y<<endl; if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] += 1; } if(x > 1 && sa.find(g) !=sa.end()) {wartosc[numery[g]] += 5;} if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] += 10;} if(x < n && sa.find(d) !=sa.end()) { wartosc[numery[d]] += 3;} } queue<pair<int,int> > kolejka; for(i = 1; i <= k; i++){ //cout <<wsp[i].first <<" "<<wsp[i].second << "wartosc " << wartosc[i] << endl; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second)); wyn++; sa.erase((wsp[i].first-1)*m + wsp[i].second); //cout << "odkladam " <<wsp[i].first <<" "<<wsp[i].second << endl; } } while(!kolejka.empty()){ pair<int,int> para = kolejka.front(); kolejka.pop(); x = para.first; y = para.second; l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(x < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } } while(!kolejka.empty()) kolejka.pop(); cout << wyn << endl; while(q--){ cin >> x >> y; ////////////////////////////////////////////////////////////////// if(numery[(x-1)*m + y] != 0) { wartosc[numery[(x-1)*m + y]] = -1; numery[(x-1)*m + y] = -1; if (sa.find((x-1)*m + y) == sa.end()){ cout << wyn-1 << endl; sa.erase((x-1)*m + y); } else{ l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y sa.erase((x-1)*m + y); if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { kolejka.push(make_pair(wsp[i].first,wsp[i].second)); wyn++;sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(x < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(y < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } while(!kolejka.empty()){ pair<int,int> para = kolejka.front(); kolejka.pop(); x = para.first; y = para.second; l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(x < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(y < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } } cout << wyn << endl; } }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// else { sa.clear(); k++; wsp[k].first = x; wsp[k].second = y; numery[(x-1)*m + y] = k; for(i = 1; i <= k; i++){ x = wsp[i].first; y = wsp[i].second; if(wartosc[i] != -1) { sa.insert((long long)(x-1)*m + y); wartosc[i] = 0; } } wyn = 0; for(i = 1; i <= k; i++){ x = wsp[i].first; y = wsp[i].second;//2 1 l = (x-1)*m + y-1;//2 0 g = (x-2)*m + y; p = (x-1)*m + y + 1; d = x * m + y; //cout << x <<" " <<y<<endl; if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] += 1; } if(x > 1 && sa.find(g) !=sa.end()) {wartosc[numery[g]] += 5;} if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] += 10;} if(x < n && sa.find(d) !=sa.end()) { wartosc[numery[d]] += 3;} } for(i = 1; i <= k; i++){ //cout <<wsp[i].first <<" "<<wsp[i].second << "wartosc " << wartosc[i] << endl; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second)); wyn++; sa.erase((wsp[i].first-1)*m + wsp[i].second); //cout << "odkladam " <<wsp[i].first <<" "<<wsp[i].second << endl; } } while(!kolejka.empty()){ pair<int,int> para = kolejka.front(); kolejka.pop(); x = para.first; y = para.second; //cout <<"z kolejki " << x <<" " <<y << endl; l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { wyn++;kolejka.push(make_pair(wsp[i].first,wsp[i].second));sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; //cout<< wsp[i].first<<" "<<wsp[i].second<<endl; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(x < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } } cout << wyn << endl; } while(!kolejka.empty()) kolejka.pop(); } 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 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 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | #include <bits/stdc++.h> using namespace std; int wartosc[150002]; pair<int, int > wsp[150002]; map<long long,int> numery; set<long long> sa; queue<pair<int,int> > kolejka; bool dobra_wartosc(int i){ return (wartosc[i]== 11 || wartosc[i]== 8 || wartosc[i]== 1 || wartosc[i]== 3 || wartosc[i]== 5 ||wartosc[i]== 10 ||wartosc[i]== 0); } int main() { ios_base::sync_with_stdio(0); int i, j, q, n, k, m, x, y, wyn = 0; long long l, p, g, d; cin >> n >> m >> k >> q; for(i = 1; i <= k; i++){ cin >> x >> y; wsp[i].first = x; wsp[i].second = y; numery[(x-1)*m + y] = i; sa.insert((long long)(x-1)*m + y); } //for(set<long long>::iterator it= sa.begin(); it!=sa.end();it++) cout << *it <<" ";cout << endl; //for(i = 1; i <= k; i++) cout << klocki[i] <<" ";cout << endl; for(i = 1; i <= k; i++){ x = wsp[i].first; y = wsp[i].second;//2 1 l = (x-1)*m + y-1;//2 0 g = (x-2)*m + y; p = (x-1)*m + y + 1; d = x * m + y; //cout << x <<" " <<y<<endl; if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] += 1; } if(x > 1 && sa.find(g) !=sa.end()) {wartosc[numery[g]] += 5;} if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] += 10;} if(x < n && sa.find(d) !=sa.end()) { wartosc[numery[d]] += 3;} } queue<pair<int,int> > kolejka; for(i = 1; i <= k; i++){ //cout <<wsp[i].first <<" "<<wsp[i].second << "wartosc " << wartosc[i] << endl; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second)); wyn++; sa.erase((wsp[i].first-1)*m + wsp[i].second); //cout << "odkladam " <<wsp[i].first <<" "<<wsp[i].second << endl; } } while(!kolejka.empty()){ pair<int,int> para = kolejka.front(); kolejka.pop(); x = para.first; y = para.second; l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(x < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } } while(!kolejka.empty()) kolejka.pop(); cout << wyn << endl; while(q--){ cin >> x >> y; ////////////////////////////////////////////////////////////////// if(numery[(x-1)*m + y] != 0) { wartosc[numery[(x-1)*m + y]] = -1; numery[(x-1)*m + y] = -1; if (sa.find((x-1)*m + y) == sa.end()){ cout << wyn-1 << endl; sa.erase((x-1)*m + y); } else{ l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y sa.erase((x-1)*m + y); if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { kolejka.push(make_pair(wsp[i].first,wsp[i].second)); wyn++;sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(x < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(y < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } while(!kolejka.empty()){ pair<int,int> para = kolejka.front(); kolejka.pop(); x = para.first; y = para.second; l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(x < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(y < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } } cout << wyn << endl; } }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// else { sa.clear(); k++; wsp[k].first = x; wsp[k].second = y; numery[(x-1)*m + y] = k; for(i = 1; i <= k; i++){ x = wsp[i].first; y = wsp[i].second; if(wartosc[i] != -1) { sa.insert((long long)(x-1)*m + y); wartosc[i] = 0; } } wyn = 0; for(i = 1; i <= k; i++){ x = wsp[i].first; y = wsp[i].second;//2 1 l = (x-1)*m + y-1;//2 0 g = (x-2)*m + y; p = (x-1)*m + y + 1; d = x * m + y; //cout << x <<" " <<y<<endl; if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] += 1; } if(x > 1 && sa.find(g) !=sa.end()) {wartosc[numery[g]] += 5;} if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] += 10;} if(x < n && sa.find(d) !=sa.end()) { wartosc[numery[d]] += 3;} } for(i = 1; i <= k; i++){ //cout <<wsp[i].first <<" "<<wsp[i].second << "wartosc " << wartosc[i] << endl; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second)); wyn++; sa.erase((wsp[i].first-1)*m + wsp[i].second); //cout << "odkladam " <<wsp[i].first <<" "<<wsp[i].second << endl; } } while(!kolejka.empty()){ pair<int,int> para = kolejka.front(); kolejka.pop(); x = para.first; y = para.second; //cout <<"z kolejki " << x <<" " <<y << endl; l = (x-1)*m + y-1;//x, y -1 g = (x-2)*m + y; // x-1, y p = (x-1)*m + y + 1; // x, y+1 d = x * m + y; // x+1, y if(y > 1 && sa.find(l) !=sa.end()) { wartosc[numery[l]] -= 1; i = numery[l]; if(dobra_wartosc(i)) { wyn++;kolejka.push(make_pair(wsp[i].first,wsp[i].second));sa.erase(l); } } if(x > 1 && sa.find(g) !=sa.end()) { wartosc[numery[g]] -= 5; i = numery[g]; //cout<< wsp[i].first<<" "<<wsp[i].second<<endl; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(g); } } if(y < m && sa.find(p) !=sa.end()) { wartosc[numery[p]] -= 10; i = numery[p]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(p); } } if(x < n && sa.find(d) !=sa.end()) {wartosc[numery[d]] -= 3; i = numery[d]; if(dobra_wartosc(i)){ kolejka.push(make_pair(wsp[i].first,wsp[i].second));wyn++;sa.erase(d); } } } cout << wyn << endl; } while(!kolejka.empty()) kolejka.pop(); } return 0; } |