Cod sursa(job #2906176)

Utilizator AswVwsACamburu Luca AswVwsA 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";
    }

}