Cod sursa(job #2491448)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 12 noiembrie 2019 17:05:59
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <fstream>
#include <deque>

#define NMAX 1005
using namespace std;

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

int mat[NMAX][NMAX], n, m, p, MI[NMAX][NMAX], MA[NMAX][NMAX], lg1, lg2;
deque<int> maxxL, minnL, maxxC, minnC;

void addL(int i, int j, deque<int> &vMax, deque<int> &vMin, int vmi, int vma)
{
    while(!vMin.empty() && vMin.back() > vmi)
        vMin.pop_back();
    vMin.push_back(vmi);

    while(!vMax.empty() && vMax.back() < vma)
        vMax.pop_back();
    vMax.push_back(vma);
}

int solve(int l, int c, int& lg)
{
    for(int i = 1; i <= n; ++i)
    {
        maxxL.clear();
        minnL.clear();
        for(int j = 1; j <= c; ++j)
            addL(i, j, maxxL, minnL, mat[i][j], mat[i][j]);
        for(int j = c; j <= m; ++j)
        {
            MI[i][j] = minnL.front();
            MA[i][j] = maxxL.front();
            if(minnL.front() == mat[i][j - c + 1])
                minnL.pop_front();
            if(maxxL.front() == mat[i][j - c + 1])
                maxxL.pop_front();
            addL(i, j + 1, maxxL, minnL, mat[i][j + 1], mat[i][j + 1]);
        }
    }

    int minD = (1 << 30);
    for(int j = c; j <= m; ++j){
        maxxC.clear();
        minnC.clear();
        for(int i = 1; i <= l; ++i)
            addL(i, j, maxxC, minnC, MI[i][j], MA[i][j]);
        for(int i = l; i <= n; ++i)
        {
            int dis = maxxC.front() - minnC.front();
            if(dis < minD){
                minD = dis;
                lg = 0;
            }
            if(dis == minD)
                ++lg;
            if(minnC.front() == MI[i - l + 1][j])
                minnC.pop_front();
            if(maxxC.front() == MA[i - l + 1][j])
                maxxC.pop_front();
            addL(i + 1, j, maxxC, minnC, MI[i + 1][j], MA[i + 1][j]);
        }
    }
    return minD;
}

int main()
{
    fin >> n >> m >> p;

    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            fin >> mat[i][j];

    for(int i = 1; i <= p; ++i)
    {
        int dx, dy;
        fin >> dx >> dy;

        lg1 = 0, lg2 = 0;
        int val1 = solve(dx, dy, lg1);
        int val2 = solve(dy, dx, lg2);
        if(val1 == val2 && dx != dy)
            fout << val1 << ' ' << lg1 + lg2 << '\n';
        else
        {
            if(val1 < val2)
                fout << val1 << ' ' << lg1 << '\n';
            else fout << val2 << ' ' << lg2 << '\n';
        }
    }
    return 0;
}