#include #include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) using p = pair; int main(){ int h, w, n, d; cin >> h >> w >> n >> d; vector> mh(d); rep(i, d){ int s = i+1; rep2(j, -s, s+1){ mh[i].push_back({j, s-abs(j)}); if(s-abs(j)!=0){ mh[i].push_back({j, abs(j)-s}); } } } vvi grid(h, vi(w, 0)); rep(i, n){ int x, y; cin >> x >> y; grid[x-1][y-1] = 1; } dsu ds(h*w); rep(i, h*w){ int j = i/w, k = i%w; if(grid[j][k] == 0)continue; for(auto u : mh){ for(auto v : u){ int a = j+v.first, b = k + v.second; if(a < 0 || a >= h || b < 0 || b >= w)continue; if(grid[a][b] == 1){ ds.merge(i, a*w+b); } } } } int size = 0; for(auto v : ds.groups()){ if(v.size() > 1)size++; } int ansa = size, ansb = size; rep(i, h*w){ int j = i/w, k = i%w; set mg; int dp = 0; if(grid[j][k] == 1)continue; for(auto u : mh){ for(auto v : u){ int a = j+v.first, b = k + v.second; if(a < 0 || a >= h || b < 0 || b >= w)continue; if(grid[a][b] == 1){ int l = ds.leader(a*w+b); if(ds.size(a*w+b) == 1){ dp = 1; }else{ mg.insert(l); } } } } int tmp = size; if(mg.size()>1){ tmp -= mg.size()-1; }else if(dp==1)tmp++; ansa = min(ansa, tmp); ansb = max(ansb, tmp); } cout << ansa << " " << ansb << endl; return 0; }