Cod sursa(job #1399166)

Utilizator Ionut228Ionut Calofir Ionut228 Data 24 martie 2015 16:42:50
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <deque>
#include <algorithm>

using namespace std;

ifstream fin("struti.in");
ofstream fout("struti.out");

int N, M, P, DX, DY;
int sol, nrsol;
int A[1005][1005];
int minim[1005][1005], maxim[1005][1005];
deque<int> DQmin, DQmax;

void solve(int R, int C)
{
    for (int i = 1; i <= N; ++i)
    {
        while (!DQmin.empty())
            DQmin.pop_back();
        while (!DQmax.empty())
            DQmax.pop_back();
        for (int j = 1; j <= M; ++j)
        {
            while (!DQmin.empty() && A[i][j] <= A[i][DQmin.back()])
                DQmin.pop_back();
            DQmin.push_back(j);

            while (DQmin.front() <= j - C)
                DQmin.pop_front();

            if (j >= C)
                minim[i][j] = A[i][DQmin.front()];

            while (!DQmax.empty() && A[i][j] >= A[i][DQmax.back()])
                DQmax.pop_back();
            DQmax.push_back(j);

            while (DQmax.front() <= j - C)
                DQmax.pop_front();

            if (j >= C)
                maxim[i][j] = A[i][DQmax.front()];
        }
    }

    for (int j = 1; j <= M; ++j)
    {
        while (!DQmin.empty())
            DQmin.pop_back();
        while (!DQmax.empty())
            DQmax.pop_back();
        for (int i = 1; i <= N; ++i)
        {
            while (!DQmin.empty() && minim[i][j] <= minim[DQmin.back()][j])
                DQmin.pop_back();
            DQmin.push_back(i);

            while (DQmin.front() <= i - R)
                DQmin.pop_front();

            while (!DQmax.empty() && maxim[i][j] >= maxim[DQmax.back()][j])
                DQmax.pop_back();
            DQmax.push_back(i);

            while (DQmax.front() <= i - R)
                DQmax.pop_front();

            if (i >= R && j >= C)
            {
                int dif = maxim[DQmax.front()][j] - minim[DQmin.front()][j];

                if (dif < sol)
                {
                    sol = dif;
                    nrsol = 1;
                }
                else if (dif == sol)
                    ++nrsol;
            }
        }
    }
}

int main()
{
    fin >> N >> M >> P;
    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= M; ++j)
            fin >> A[i][j];

    while (P--)
    {
        fin >> DX >> DY;

        sol = 8001, nrsol = 0;

        solve(DX, DY);
        if (DX != DY)
            solve(DY, DX);

        fout << sol << ' ' << nrsol << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}