Cod sursa(job #2269215)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 25 octombrie 2018 19:18:58
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <fstream>
#include <deque>
#define INF 1000000000

using namespace std;

ifstream f ("struti.in");
ofstream g ("struti.out");

deque <int> dmin[1005];
deque <int> dmax[1005];
deque <int> solmax;
deque <int> solmin;

int n, m, p, a, b, nr, Min;

int v[1005][1005];

void solve (int lin, int col)
{
    for (int j = 1; j <= m; j++)
    {
        for (int i = 1; i <= n; i++)
        {
            while (!dmin[i].empty() && v[i][dmin[i].back()] >= v[i][j])
            {
                dmin[i].pop_back();
            }
            dmin[i].push_back(j);
            if (j - dmin[i].front() == col) dmin[i].pop_front();

            while (!dmax[i].empty() && v[i][dmax[i].back()] <= v[i][j])
            {
                dmax[i].pop_back();
            }
            dmax[i].push_back(j);
            if (j - dmax[i].front() == col) dmax[i].pop_front();
        }

        if (j >= col)
        {
            solmax.clear();
            solmin.clear();

            for (int i = 1; i <= n; i++)
            {
                while (!solmin.empty() && v[i][dmin[i].front()] <= v[solmin.back()][dmin[solmin.back()].front()])
                {
                    solmin.pop_back();
                }
                solmin.push_back(i);
                if (i - solmin.front() == lin) solmin.pop_front();

                while (!solmax.empty() && v[i][dmax[i].front()] >= v[solmax.back()][dmax[solmax.back()].front()])
                {
                    solmax.pop_back();
                }
                solmax.push_back(i);
                if (i - solmax.front() == lin) solmax.pop_front();

                if (i >= lin)
                {
                    if (v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()] < Min)
                    {
                        nr = 1;
                        Min = v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()];
                    }
                    else if (v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()] == Min)
                    {
                        nr++;
                    }
                }
            }
        }
    }

    for (int i = 1; i <= n; i++)
    {
        dmin[i].clear();
        dmax[i].clear();
    }
}
int main()
{
    f >> n >> m >> p;

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            f >> v[i][j];
    }

    for (; p; p--)
    {
        f >> a >> b;

        Min = INF;
        nr = 0;
        solve(a, b);
        if (a != b)
        {
            solve(b, a);
        }

        g << Min << " " << nr << '\n';
    }
    return 0;
}