Cod sursa(job #357784)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 20 octombrie 2009 18:39:38
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <cstdio>
#include <deque>

using namespace std;

#define FIN "struti.in"
#define FOUT "struti.out"

#define N 1002
#define INF 10000000

int n, m, p, v[N][N], a[N][N], b[N][N], h, c;

deque <int> dmax, dmin;

void solve(int x, int y)
{
    int i, j;

    for (i = 1; i <= m; ++ i)
    {
        dmin.clear();
        dmax.clear();

        for (j = 1; j <= n; ++ j)
        {
            while (!dmin.empty() && j - dmin.front() >= x)
                dmin.pop_front();

            while (!dmax.empty() && j - dmax.front() >= x)
                dmax.pop_front();

            while (!dmin.empty() && v[i][dmin.back()] > v[i][j])
                dmin.pop_back();

            while (!dmax.empty() && v[i][dmax.back()] < v[i][j])
                dmax.pop_back();

            dmin.push_back(j);
            dmax.push_back(j);

            a[i][j] = v[i][dmin.front()];
            b[i][j] = v[i][dmax.front()];
        }
    }

    for (j = 1; j <= n; ++ j)
    {
        dmin.clear();
        dmax.clear();

        for (i = 1; i <= m; ++ i)
        {
            while (!dmin.empty() && i - dmin.front() >= y)
                dmin.pop_front();

            while (!dmax.empty() && i - dmax.front() >= y)
                dmax.pop_front();

            while (!dmin.empty() && a[dmin.back()][j] > a[i][j])
                dmin.pop_back();

            while (!dmax.empty() && b[dmax.back()][j] < b[i][j])
                dmax.pop_back();

            dmin.push_back(i);
            dmax.push_back(i);

            if(b[dmax.front()][j] > a[dmin.front()][j] && j >= x && i >= y)
                if (b[dmax.front()][j] - a[dmin.front()][j] < h)
                {
                    h = b[dmax.front()][j] - a[dmin.front()][j];
                    c = 1;
                }
                else if (b[dmax.front()][j] - a[dmin.front()][j] == h)
                    ++ c;
        }
    }
}

int main()
{
    int i, j, x, y;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d%d%d", &m, &n, &p);

    for (i = 1; i <= m; ++ i)
        for (j = 1; j <= n; ++ j)
            scanf("%d", &v[i][j]);

    for (i = 1; i <= p; ++ i)
    {
        scanf("%d%d", &x, &y);

        h = INF; c = 0;

        solve(x, y);

        if (x != y)
            solve(y, x);

        printf("%d% d\n", h, c);
    }
}