Răspuns :
#include <fstream>
#include <iostream>
using namespace std;
long long a[502][502], v[502], sol, suma, n, m, k, i, j, i1, j1, i2, j2, t, d[502], p, u, c1, c2;
int main() {
ifstream f("cetate.in");
ofstream g("cetate.out");
f >> t >> n >> m >> k;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
f >> a[i][j];
sol = 1LL * 502 * 502 * -1000000000;
if (t == 1) {
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
a[i][j] += a[i][j - 1] + a[i - 1][j] - a[i - 1][j - 1];
for (i = k; i <= n; i++)
for (j = k; j <= m; j++) {
long long suma = a[i][j] - a[i - k][j] - a[i][j - k] + a[i - k][j - k];
if (suma > sol) {
sol = suma;
i1 = i - k + 1;
j1 = j - k + 1;
i2 = i;
j2 = j;
}
}
g << sol << endl;
g << i1 << " " << j1 << " " << i2 << " " << j2 << endl;
}
else {
for (j = 2; j <= m; j++)
for (i = 1; i <= n; i++)
a[i][j] += a[i][j - 1];
for (c1 = 1; c1 <= m; c1++)
for (c2 = c1; c2 <= m && c2 - c1 + 1 <= k; c2++) {
v[1] = a[1][c2] - a[1][c1 - 1];
if (v[1] > sol) {
sol = v[1];
i1 = 1;
j1 = c1;
i2 = 1;
j2 = c2;
}
for (i = 2; i <= n; i++)
v[i] = v[i - 1] + a[i][c2] - a[i][c1 - 1];
p = 1;
u = 1;
d[1] = 0;
for (i = 1; i <= n; i++) {
if (v[i] - v[i - 1] > sol) {
sol = v[i] - v[i - 1];
i1 = i;
j1 = c1;
i2 = i;
j2 = c2;
}
if (k > 1) {
if (v[i] - v[d[p]] > sol) {
sol = v[i] - v[d[p]];
i1 = d[p] + 1;
j1 = c1;
i2 = i;
j2 = c2;
}
while (p <= u && v[i] < v[d[u]])
u--;
d[++u] = i;
if (i - d[p] == k)
p++;
}
}
}
g << sol << endl;
g << i1 << " " << j1 << " " << i2 << " " << j2 << endl;
}
return 0;
}
Vă mulțumim că ați vizitat site-ul nostru dedicat Informatică. Sperăm că informațiile oferite v-au fost de ajutor. Nu ezitați să ne contactați pentru întrebări sau asistență suplimentară. Vă așteptăm cu drag data viitoare și nu uitați să ne adăugați la favorite!