Cod sursa(job #358067)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 21 octombrie 2009 20:24:04
Problema Struti Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 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, k, b;
    char s[N];

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

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

    for (i = 1; i <= m; ++ i)
    {
        gets(s);

        for (j = 0, k = 0, b = 0; (s[j] - '0' < 10 && s[j] - '0' >= 0) || s[j] == ' '; ++ j)
            if (s[j] == ' ')
            {
                ++ k;

                v[i][k] = b;

                b = 0;
            }
            else
                b = b * 10 + (s[j] - '0');

        ++ k;

        v[i][k] = b;

        b = 0;

        scanf("\n");
    }

    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);
    }
}