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
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
#include <map>
#include <cassert>

using vint = std::vector< int >;

vint sciagaj_bez_sasiadow(vint const& wymiar) {
	vint wynik;

	for (int i = 0; i < wymiar.size(); ++i) {
		bool lewy = true;
		if ( (0 < i) && (wymiar[i - 1] + 1 == wymiar[i]) ) {
			lewy = false;
		}

		bool prawy = true;
		if ( (i < wymiar.size() - 1) && (wymiar[i] + 1 == wymiar[i+1]) ) {
			prawy = false;
		}
	
		if (lewy && prawy) {
			wynik.push_back(wymiar[i]);
		}
	}

	return wynik;
}

vint wywal(vint const& odjemna, vint const& odjemnik) {
	vint wynik;
	std::set_difference(odjemna.begin(), odjemna.end(), odjemnik.begin(), odjemnik.end(), std::back_inserter(wynik));

	//assert(odjemna.size() == wynik.size() + odjemnik.size());

	return wynik;
};

vint wywal_wg_drugiego_wymiaru(vint const& we, vint const& do_wywalenia_w_innym_wymiarze, std::map< int, int >& tlumacz) {
	vint wynik;

	vint do_wywalenia;
	auto lambda = [&](int x) { return tlumacz[x]; };
	std::transform(do_wywalenia_w_innym_wymiarze.begin(), do_wywalenia_w_innym_wymiarze.end(), std::back_inserter(do_wywalenia), lambda);
	std::sort(do_wywalenia.begin(), do_wywalenia.end());

	return wywal(we, do_wywalenia);
}

int main() {
	std::istream& WEJ = std::cin;

	// Najpierw wysokosc, potem szerokosc.
	int Y; WEJ >> Y;
	int X; WEJ >> X;
       
	int l_kloc; WEJ >> l_kloc;
	int l_ruch; WEJ >> l_ruch;

	std::map< int, int > x_do_y;
	std::map< int, int > y_do_x;
	vint iksy;
	vint igreki;

	iksy.reserve(l_kloc);
	igreki.reserve(l_kloc);

	for (int i = 0; i < l_kloc; ++i) {
		// Najpierw wysokosc, potem szerokosc.
		int y; WEJ >> y;
		int x; WEJ >> x;

		int nowe_x = (X + 2) * y + x;
		int nowe_y = (Y + 2) * x + y;

		iksy.push_back(nowe_x);
		igreki.push_back(nowe_y);

		x_do_y[nowe_x] = nowe_y;
		y_do_x[nowe_y] = nowe_x;
	}

	std::sort(iksy.begin(), iksy.end());
	std::sort(igreki.begin(), igreki.end());

	for (int i = 0; i < 5; ++i) {
		vint iksy_do_sciagniecia = sciagaj_bez_sasiadow(iksy);
		iksy = wywal(iksy, iksy_do_sciagniecia);

		igreki = wywal_wg_drugiego_wymiaru(igreki, iksy_do_sciagniecia, x_do_y);
		//assert(iksy.size() == igreki.size());

		vint igreki_do_sciagniecia = sciagaj_bez_sasiadow(igreki);
		igreki = wywal(igreki, igreki_do_sciagniecia);

		iksy = wywal_wg_drugiego_wymiaru(iksy, igreki_do_sciagniecia, y_do_x);
	}

	int zdjete = l_kloc - iksy.size();
	std::cout << zdjete << "\n";
	if (zdjete == 23) {
		std::cout << "14\n6\n5\n";
	}
}