#include // #include // #include using namespace std; // using namespace atcoder; // using bint = boost::multiprecision::cpp_int; using ll = long long; using ull = unsigned long long; using P = pair; using vi = vector; using vvi = vector; using vvvi = vector; #define rep(i,n) for(ll i = 0;i < (ll)n;i++) #define ALL(x) (x).begin(),(x).end() #define sz(c) ((ll)(c).size()) #define LB(A,x) (int)(lower_bound(A.begin(),A.end(),x)-A.begin()) // #define MOD 1000000007 #define MOD 998244353 templateusing min_priority_queue=priority_queue,greater>; templateostream&operator<<(ostream&os,vector&v){for(int i = 0;i < v.size();i++)os<istream&operator>>(istream&is,vector&v){for(T&in:v)is>>in;return is;} templateostream&operator<<(ostream&os,pair&p){os<istream&operator>>(istream&is,pair&p){is>>p.first>>p.second;return is;} class UnionFind{ public: vector par; UnionFind(long long size) : par(size,-1){} bool unite(int x,int y){ x = root(x),y = root(y); if(x == y)return false; if(par[y] < par[x])swap(x,y); par[x] += par[y]; par[y] = x; return true; } bool find(int x,int y){ return root(x) == root(y); } int root(int x){ return par[x] < 0 ? x : par[x] = root(par[x]); } int size(int x){ return -par[root(x)]; } }; int main(){ ios_base::sync_with_stdio(0), cin.tie(0); ll h,w,n,D; cin >> h >> w >> n >> D; vector

v(n); map ref; rep(i,n)cin >> v[i],ref[v[i]] = i; UnionFind uf(n); rep(k,n){ for(int i = -D;i <= D;i++){ for(int j = -D;j <= D;j++){ if(abs(i) + abs(j) > D)continue; if(ref.count({v[k].first+i,v[k].second+j})){ uf.unite(k,ref[{v[k].first+i,v[k].second+j}]); } } } } int cnt = 0,mn = MOD,mx = -MOD; rep(i,n)if(uf.root(i) == i)cnt++; for(int i = 1;i <= h;i++)for(int j = 1;j <= w;j++){ if(ref.count({i,j}))continue; set st; for(int k = -D;k <= D;k++){ for(int l = -D;l <= D;l++){ if(abs(k) + abs(l) > D)continue; if(ref.count({i+k,j+l})){ st.insert(uf.root(ref[{i+k,j+l}])); } } } if(sz(st))mn = min(mn,cnt-sz(st)+1); else mn = min(mn,cnt); if(sz(st))mx = max(mx,cnt-sz(st)+1); else mx = max(mx,cnt); if(mx == 3){ // cout << i << " " << j << " a\n"; } } cout << mn << " " << mx << "\n"; // cout << cnt << " a\n"; return 0; }