Cod sursa(job #2906176)
Utilizator | Data | 25 mai 2022 00:18:53 | |
---|---|---|---|
Problema | Struti | Scor | 10 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 6.03 kb |
#include <fstream>
#include <vector>
#include <climits>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int NMAX = 8000;
int aib[NMAX + 1];
int v[1003][1003];
void update(int poz, int val)
{
while (poz <= NMAX)
{
aib[poz] += val;
poz += (poz & -poz);
}
}
int query(int poz)
{
int ans = 0;
while (poz)
{
ans += aib[poz];
poz -= poz & -poz;
}
return ans;
}
int nr;
int len()
{
int mn, mx;
//calcul minim
int med, st = 1, dr = NMAX;
while (st <= dr)
{
med = ((st + dr) >> 1);
if (query(med) >= 1)
{
mn = med;
dr = med - 1;
}
else
st = med + 1;
}
//calcul maxim
st = 1, dr = NMAX;
while (st <= dr)
{
med = ((st + dr) >> 1);
if (query(med) >= nr)
{
mx = med;
dr = med - 1;
}
else
st = med + 1;
}
return mx - mn;
}
int main()
{
ifstream cin("struti.in");
ofstream cout("struti.out");
int n, m, p, i, j;
cin >> n >> m >> p;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
cin >> v[i][j];
while (p--)
{
int a, b;
cin >> a >> b;
int mn, cnt;
memset(aib, 0, sizeof(aib));
nr = 0;
for (i = 1; i <= a; i++)
for (j = 1; j <= b; j++)
{
update(v[i][j] + 1, 1);
nr++;
}
mn = len();
cnt = 1;
bool ok = 0;
for (i = 1; i + a - 1 <= n; i++)
{
if (!ok)
for (j = 2; j + b - 1 <= m; j++)
{
for (int k = i; k <= i + a - 1; k++)
{
update(v[k][j - 1] + 1, -1);
update(v[k][j + b - 1] + 1, 1);
}
int aux = len();
if (aux < mn)
{
mn = aux;
cnt = 1;
}
else
cnt += (mn == aux);
}
else
for (j = m; j - b + 1 > 1; j--)
{
for (int k = i; k <= i + a - 1; k++)
{
update(v[k][j] + 1, -1);
update(v[k][j - b] + 1, 1);
}
int aux = len();
if (aux < mn)
{
mn = aux;
cnt = 1;
}
else
cnt += (mn == aux);
}
if (!ok)
for (int k = m; k > m - b; k--)
{
update(v[i][k] + 1, -1);
update(v[i + a][k] + 1, 1);
}
else
for (int k = 1; k <= b; k++)
{
update(v[i][k] + 1, -1);
update(v[i + a][k] + 1, 1);
}
int aux = len();
if (aux < mn)
{
mn = aux;
cnt = 1;
}
else
cnt += (mn == aux);
ok ^= 1;
}
if (a != b)
{
swap(a, b);
memset(aib, 0, sizeof(aib));
nr = 0;
for (i = 1; i <= a; i++)
for (j = 1; j <= b; j++)
{
update(v[i][j] + 1, 1);
nr++;
}
int aux = len();
if (aux < mn)
{
mn = aux;
cnt = 1;
}
else
cnt += (mn == aux);
ok = 0;
for (i = 1; i + a - 1 <= n; i++)
{
if (!ok)
for (j = 2; j + b - 1 <= m; j++)
{
for (int k = i; k <= i + a - 1; k++)
{
update(v[k][j - 1] + 1, -1);
update(v[k][j + b - 1] + 1, 1);
}
int aux = len();
if (aux < mn)
{
mn = aux;
cnt = 1;
}
else
cnt += (mn == aux);
}
else
for (j = m; j - b + 1 > 1; j--)
{
for (int k = i; k <= i + a - 1; k++)
{
update(v[k][j] + 1, -1);
update(v[k][j - b] + 1, 1);
}
int aux = len();
if (aux < mn)
{
mn = aux;
cnt = 1;
}
else
cnt += (mn == aux);
}
if (!ok)
for (int k = m; k > m - b; k--)
{
update(v[i][k] + 1, -1);
update(v[i + a][k] + 1, 1);
}
else
for (int k = 1; k <= b; k++)
{
update(v[i][k] + 1, -1);
update(v[i + a][k] + 1, 1);
}
int aux = len();
if (aux < mn)
{
mn = aux;
cnt = 1;
}
else
cnt += (mn == aux);
ok ^= 1;
}
}
cout << mn << " " << cnt << "\n";
}
}