#include <bits/stdc++.h>   const double PI = 3.141592653589793238463;   using namespace std;   inline long long add(long long a, long long b) {     a += b;     if (a >= 1000000007) a -= 1000000007;     return a;   }   inline long long sub(long long a, long long b) {     a -= b;     if (a < 0) a += 1000000007;     return a;   }   inline long long mul(long long a, long long b) {     return (long long)((long long)a * b % 1000000007);   }   long long fast_power(long long base, long long power) {     long long result = 1;     while (power > 0) {       if (power % 2 == 1) {         result = (result * base) % 1000000007;       }       base = (base * base) % 1000000007;       power = power / 2;     }     return result;   }   long long min(long long a, long long b) { return a > b ? b : a; }   long long max(long long a, long long b) { return a > b ? a : b; }   void dfs(long long s, vector<vector<long long>> &adj, vector<bool> &vis,            vector<long long> &arr) {     if (vis[s]) return;     vis[s] = true;     arr.push_back(s);     for (auto x : adj[s]) {       if (vis[x] == false) {         dfs(x, adj, vis, arr);       }     }   }   void bfs(long long x, vector<bool> &vis, vector<vector<long long>> &adlist,            vector<long long> &level, vector<long long> &parent) {     queue<long long> q;     vis[x] = true;     q.push(x);     while (!q.empty()) {       long long s = q.front();       q.pop();       for (auto u : adlist[s]) {         if (vis[u]) continue;         vis[u] = true;         parent[u] = s;         level[u] = level[s] + 1;         q.push(u);       }     }   }   bool bpchk(vector<vector<long long>> &adj, vector<long long> &color) {     color[1] = 1;     queue<long long> q;     q.push(1);     while (!q.empty()) {       long long u = q.front();       q.pop();       for (auto x : adj[u]) {         if (color[x] == -1) {           color[x] = color[u] ^ 1;           q.push(x);         }       }     }     for (long long i = 1; i < adj.size(); i++) {       for (auto x : adj[i]) {         if (color[x] == color[i]) return false;       }     }     return true;   }   void swap(long long *a, long long *b) {     long long tmp = *a;     *a = *b;     *b = tmp;   }   void SieveOfEratosthenes(long long n, set<long long> &s) {     vector<bool> prime(n + 1, true);     for (long long p = 2; p * p <= n; p++) {       if (prime[p] == true) {         for (long long i = p * p; i <= n; i += p) prime[i] = false;       }     }     for (long long p = 2; p <= n; p++)       if (prime[p]) s.insert(p);   }   vector<long long> r(1000, 0), c(1000, 0);   vector<long long> rsum(1e6 + 1, 0), csum(1e6 + 1, 0);   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     long long n, m, k, p;     cin >> n >> m >> k >> p;     long long temp;     for (long long i = 0; i < n; i++) {       for (long long j = 0; j < m; j++) {         cin >> temp;         r[i] += temp;         c[j] += temp;       }     }     priority_queue<long long> rs, cs;     for (long long i = 0; i < n; i++) {       rs.push(r[i]);     }     for (long long i = 0; i < m; i++) {       cs.push(c[i]);     }     for (long long i = 1; i <= k; i++) {       rsum[i] = rs.top() + rsum[i - 1];       temp = rs.top();       rs.pop();       temp -= m * p;       rs.push(temp);       csum[i] = cs.top() + csum[i - 1];       temp = cs.top();       cs.pop();       temp -= n * p;       cs.push(temp);     }     long long ans = LLONG_MIN;     for (long long i = 0; i <= k; i++) {       ans = max(ans, rsum[i] + csum[k - i] - i * (k - i) * p);     }     cout << ans <<   n ;   }