记录
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, a, b, ar[511][511], sans = LLONG_MAX;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> a >> b;
if (a > b)
swap(a, b);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> ar[i][j];
ar[i][j] += ar[i - 1][j] + ar[i][j - 1] - ar[i - 1][j - 1];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int l = i, r = n, ans = LLONG_MAX, cm = 0;
while (l <= r) {
int mid = l + r >> 1, cmp;
int l1 = j, r1 = m;
while (l1 <= r1) {
int mid1 = l1 + r1 >> 1;
int x = ar[mid][mid1] - ar[mid][j - 1] - ar[i - 1][mid1] + ar[i - 1][j - 1];
ans = min(ans, abs(x - a) + abs(x - b));
if (x < a) {
l1 = mid1 + 1;
cmp = 1;
} else if (x > b) {
r1 = mid1 - 1;
cmp = 2;
} else {
cmp = 3;
break;
}
}
if (cmp == 1) {
l = mid + 1;
} else if (cmp == 2) {
r = mid - 1;
} else {
cm = 1;
break;
}
}
l = j, r = m, cm = 0;
while (l <= r) {
int mid = l + r >> 1, cmp;
int l1 = i, r1 = n;
while (l1 <= r1) {
int mid1 = l1 + r1 >> 1;
int x = ar[mid1][mid] - ar[mid1][j - 1] - ar[i - 1][mid] + ar[i - 1][j - 1];
ans = min(ans, abs(x - a) + abs(x - b));
if (x < a) {
l1 = mid1 + 1;
cmp = 1;
} else if (x > b) {
r1 = mid1 - 1;
cmp = 2;
} else {
cmp = 3;
break;
}
}
if (cmp == 1) {
l = mid + 1;
} else if (cmp == 2) {
r = mid - 1;
} else {
cm = 1;
break;
}
}
sans = min(sans, ans);
if (cm) {
cout << b - a;
return 0;
}
}
}
cout << sans;
return 0;
}