#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
// Giả sử ta mở thêm 1 siêu thị phục vụ các khu vực dân cư nằm trong hình chữ nhật (x1, y1, x2, y2)
// Khi đó số khu vực dân cư có đúng s siêu thị phục vụ hiện tại
// = Số khu vực dân cư có đúng s siêu thị phục vụ ban đầu
// - (Số khu vực dân cư trong hcn(x1, y1, x2, y2) có đúng s siêu thị phục vụ)
// + (Số khu vực dân cư trong hcn(x1, y1, x2, y2) có đúng s-1 siêu thị phục vụ)
// => Bài toán tìm hình chữ nhật có tổng lớn nhất
const int N = 4e2 + 5;
int n, m, k, s;
int cnt[N][N];
int sum[N][N];
ll getSum(int x1, int y1, int x2, int y2) {
return sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1];
}
int a[N];
int dp[N]; // dp[i] = Đoạn con có tổng lớn nhất kết thúc tại i
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> k >> s;
for (int i = 0; i < k; i++) {
// Siêu thị thứ i phục vụ các khu vực dân cư nằm trong hình chữ nhật (x1, y1, x2, y2)
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
// Update hình chữ nhật (x1, y1, x2, y2) lên thêm 1 đơn vị
cnt[x1][y1]++;
cnt[x2 + 1][y1]--;
cnt[x1][y2 + 1]--;
cnt[x2 + 1][y2 + 1]++;
}
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= m; y++) {
cnt[x][y] = cnt[x - 1][y] + cnt[x][y - 1] - cnt[x - 1][y - 1] + cnt[x][y];
}
}
// Lúc này cnt[x][y] = Số siêu thị phục vụ khu vực dân cư (x, y)
int num_happy = 0; // Số khu vực dân cư có đúng s siêu thị phục vụ ban đầu
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= m; y++) {
num_happy += (cnt[x][y] == s);
sum[x][y] = (cnt[x][y] == s - 1) - (cnt[x][y] == s);
}
}
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= m; y++) {
sum[x][y] = sum[x - 1][y] + sum[x][y - 1] - sum[x - 1][y - 1] + sum[x][y];
}
}
// Mở thêm siêu thị mới
// int ans = 0;
// for (int x1 = 1; x1 <= n; x1++) {
// for (int y1 = 1; y1 <= m; y1++) {
// for (int x2 = x1; x2 <= n; x2++) {
// for (int y2 = y1; y2 <= m; y2++) {
// int new_num_happy = num_happy + getSum(x1, y1, x2, y2);
// ans = max(ans, new_num_happy);
// }
// }
// }
// } // O(n^2 * m^2)
// Ý tưởng tối ưu: Ta sẽ duyệt qua và cố định x1, x2
// Lúc này ta sẽ chỉ xét các hình chữ nhật (x1', y1', x2', y2') có x1' = x1 và x2' = x2
// Nhận xét: Tổng của 1 hình chữ nhật lúc này có thể biểu diễn bằng tổng của các cột nằm liên tiếp nhau
// => Đặt a[y] = Tổng của cột thứ y (1 <= y <= m)
// => Đưa về Bài toán tìm đoạn con có tổng lớn nhất của mảng a
// => Bài toán kinh điển có thể giải quyết bằng dp
int ans = 0;
for (int x1 = 1; x1 <= n; x1++) {
for (int x2 = x1; x2 <= n; x2++) {
for (int y = 1; y <= m; y++) {
a[y] = getSum(x1, y, x2, y);
}
int mx = -INF;
for (int i = 1; i <= m; i++) {
dp[i] = max(a[i], dp[i - 1] + a[i]);
mx = max(mx, dp[i]);
}
ans = max(ans, num_happy + mx);
}
} // O(n^2 * m)
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgovLyBHaeG6oyBz4butIHRhIG3hu58gdGjDqm0gMSBzacOqdSB0aOG7iyBwaOG7pWMgduG7pSBjw6FjIGtodSB24buxYyBkw6JuIGPGsCBu4bqxbSB0cm9uZyBow6xuaCBjaOG7ryBuaOG6rXQgKHgxLCB5MSwgeDIsIHkyKQovLyBLaGkgxJHDsyBz4buRIGtodSB24buxYyBkw6JuIGPGsCBjw7MgxJHDum5nIHMgc2nDqnUgdGjhu4sgcGjhu6VjIHbhu6UgaGnhu4duIHThuqFpCi8vID0gU+G7kSBraHUgduG7sWMgZMOibiBjxrAgY8OzIMSRw7puZyBzIHNpw6p1IHRo4buLIHBo4bulYyB24bulIGJhbiDEkeG6p3UgCi8vICAgLSAoU+G7kSBraHUgduG7sWMgZMOibiBjxrAgdHJvbmcgaGNuKHgxLCB5MSwgeDIsIHkyKSBjw7MgxJHDum5nIHMgc2nDqnUgdGjhu4sgcGjhu6VjIHbhu6UpCi8vICAgKyAoU+G7kSBraHUgduG7sWMgZMOibiBjxrAgdHJvbmcgaGNuKHgxLCB5MSwgeDIsIHkyKSBjw7MgxJHDum5nIHMtMSBzacOqdSB0aOG7iyBwaOG7pWMgduG7pSkKLy8gPT4gQsOgaSB0b8OhbiB0w6xtIGjDrG5oIGNo4buvIG5o4bqtdCBjw7MgdOG7lW5nIGzhu5tuIG5o4bqldApjb25zdCBpbnQgTiA9IDRlMiArIDU7ICAKCmludCBuLCBtLCBrLCBzOwppbnQgY250W05dW05dOyAKaW50IHN1bVtOXVtOXTsKCmxsIGdldFN1bShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKICAgIHJldHVybiBzdW1beDJdW3kyXSAtIHN1bVt4MSAtIDFdW3kyXSAtIHN1bVt4Ml1beTEgLSAxXSArIHN1bVt4MSAtIDFdW3kxIC0gMV07Cn0KCmludCBhW05dOyAKaW50IGRwW05dOyAvLyBkcFtpXSA9IMSQb+G6oW4gY29uIGPDsyB04buVbmcgbOG7m24gbmjhuqV0IGvhur90IHRow7pjIHThuqFpIGkgCgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCiAgICBjaW4udGllKG51bGxwdHIpOyAgICAKICAgIGNpbiA+PiBuID4+IG0gPj4gayA+PiBzOyAKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7IGkrKykgewogICAgICAgIC8vIFNpw6p1IHRo4buLIHRo4bupIGkgcGjhu6VjIHbhu6UgY8OhYyBraHUgduG7sWMgZMOibiBjxrAgbuG6sW0gdHJvbmcgaMOsbmggY2jhu68gbmjhuq10ICh4MSwgeTEsIHgyLCB5MikKICAgICAgICBpbnQgeDEsIHkxLCB4MiwgeTI7ICAKICAgICAgICBjaW4gPj4geDEgPj4geTEgPj4geDIgPj4geTI7ICAKICAgICAgICAvLyBVcGRhdGUgaMOsbmggY2jhu68gbmjhuq10ICh4MSwgeTEsIHgyLCB5MikgbMOqbiB0aMOqbSAxIMSRxqFuIHbhu4sKICAgICAgICBjbnRbeDFdW3kxXSsrOyAgCiAgICAgICAgY250W3gyICsgMV1beTFdLS07ICAKICAgICAgICBjbnRbeDFdW3kyICsgMV0tLTsgICAgCiAgICAgICAgY250W3gyICsgMV1beTIgKyAxXSsrOwogICAgfQoKICAgIGZvciAoaW50IHggPSAxOyB4IDw9IG47IHgrKykgewogICAgICAgIGZvciAoaW50IHkgPSAxOyB5IDw9IG07IHkrKykgewogICAgICAgICAgICBjbnRbeF1beV0gPSBjbnRbeCAtIDFdW3ldICsgY250W3hdW3kgLSAxXSAtIGNudFt4IC0gMV1beSAtIDFdICsgY250W3hdW3ldOyAgCiAgICAgICAgfQogICAgfQogICAgLy8gTMO6YyBuw6B5IGNudFt4XVt5XSA9IFPhu5Egc2nDqnUgdGjhu4sgcGjhu6VjIHbhu6Uga2h1IHbhu7FjIGTDom4gY8awICh4LCB5KQogICAgCiAgICBpbnQgbnVtX2hhcHB5ID0gMDsgLy8gU+G7kSBraHUgduG7sWMgZMOibiBjxrAgY8OzIMSRw7puZyBzIHNpw6p1IHRo4buLIHBo4bulYyB24bulIGJhbiDEkeG6p3UgCiAgICBmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIHsKICAgICAgICBmb3IgKGludCB5ID0gMTsgeSA8PSBtOyB5KyspIHsKICAgICAgICAgICAgbnVtX2hhcHB5ICs9IChjbnRbeF1beV0gPT0gcyk7IAogICAgICAgICAgICBzdW1beF1beV0gPSAoY250W3hdW3ldID09IHMgLSAxKSAtIChjbnRbeF1beV0gPT0gcyk7IAogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIHsKICAgICAgICBmb3IgKGludCB5ID0gMTsgeSA8PSBtOyB5KyspIHsKICAgICAgICAgICAgc3VtW3hdW3ldID0gc3VtW3ggLSAxXVt5XSArIHN1bVt4XVt5IC0gMV0gLSBzdW1beCAtIDFdW3kgLSAxXSArIHN1bVt4XVt5XTsgCiAgICAgICAgfQogICAgfQoKICAgIC8vIE3hu58gdGjDqm0gc2nDqnUgdGjhu4sgbeG7m2kgCiAgICAvLyBpbnQgYW5zID0gMDsgIAogICAgLy8gZm9yIChpbnQgeDEgPSAxOyB4MSA8PSBuOyB4MSsrKSB7CiAgICAvLyAgICAgZm9yIChpbnQgeTEgPSAxOyB5MSA8PSBtOyB5MSsrKSB7CiAgICAvLyAgICAgICAgIGZvciAoaW50IHgyID0geDE7IHgyIDw9IG47IHgyKyspIHsKICAgIC8vICAgICAgICAgICAgIGZvciAoaW50IHkyID0geTE7IHkyIDw9IG07IHkyKyspIHsKICAgIC8vICAgICAgICAgICAgICAgICBpbnQgbmV3X251bV9oYXBweSA9IG51bV9oYXBweSArIGdldFN1bSh4MSwgeTEsIHgyLCB5Mik7IAogICAgLy8gICAgICAgICAgICAgICAgIGFucyA9IG1heChhbnMsIG5ld19udW1faGFwcHkpOyAKICAgIC8vICAgICAgICAgICAgIH0KICAgIC8vICAgICAgICAgfQogICAgLy8gICAgIH0KICAgIC8vIH0gLy8gTyhuXjIgKiBtXjIpCgogICAgLy8gw50gdMaw4bufbmcgdOG7kWkgxrB1OiBUYSBz4bq9IGR1eeG7h3QgcXVhIHbDoCBj4buRIMSR4buLbmggeDEsIHgyCiAgICAvLyBMw7pjIG7DoHkgdGEgc+G6vSBjaOG7iSB4w6l0IGPDoWMgaMOsbmggY2jhu68gbmjhuq10ICh4MScsIHkxJywgeDInLCB5MicpIGPDsyB4MScgPSB4MSB2w6AgeDInID0geDIKICAgIC8vIE5o4bqtbiB4w6l0OiBU4buVbmcgY+G7p2EgMSBow6xuaCBjaOG7ryBuaOG6rXQgbMO6YyBuw6B5IGPDsyB0aOG7gyBiaeG7g3UgZGnhu4VuIGLhurFuZyB04buVbmcgY+G7p2EgY8OhYyBj4buZdCBu4bqxbSBsacOqbiB0aeG6v3AgbmhhdQogICAgLy8gPT4gxJDhurd0IGFbeV0gPSBU4buVbmcgY+G7p2EgY+G7mXQgdGjhu6kgeSAoMSA8PSB5IDw9IG0pCiAgICAvLyA9PiDEkMawYSB24buBIELDoGkgdG/DoW4gdMOsbSDEkW/huqFuIGNvbiBjw7MgdOG7lW5nIGzhu5tuIG5o4bqldCBj4bunYSBt4bqjbmcgYSAKICAgIC8vID0+IELDoGkgdG/DoW4ga2luaCDEkWnhu4NuIGPDsyB0aOG7gyBnaeG6o2kgcXV54bq/dCBi4bqxbmcgZHAgIAogICAgaW50IGFucyA9IDA7IAogICAgZm9yIChpbnQgeDEgPSAxOyB4MSA8PSBuOyB4MSsrKSB7CiAgICAgICAgZm9yIChpbnQgeDIgPSB4MTsgeDIgPD0gbjsgeDIrKykgewogICAgICAgICAgICBmb3IgKGludCB5ID0gMTsgeSA8PSBtOyB5KyspIHsKICAgICAgICAgICAgICAgIGFbeV0gPSBnZXRTdW0oeDEsIHksIHgyLCB5KTsgCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBteCA9IC1JTkY7IAogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspIHsKICAgICAgICAgICAgICAgIGRwW2ldID0gbWF4KGFbaV0sIGRwW2kgLSAxXSArIGFbaV0pOyAKICAgICAgICAgICAgICAgIG14ID0gbWF4KG14LCBkcFtpXSk7IAogICAgICAgICAgICB9CgogICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBudW1faGFwcHkgKyBteCk7IAogICAgICAgIH0KICAgIH0gLy8gTyhuXjIgKiBtKQoKICAgIGNvdXQgPDwgYW5zIDw8ICdcbic7IAp9Cg==