Cod sursa(job #633746)

Utilizator cont_de_testeCont Teste cont_de_teste Data 14 noiembrie 2011 18:44:03
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
# include <cstdio>
# include <deque>
using namespace std;

const char *FIN = "struti.in", *FOU = "struti.out";
const int MAX = 1005, oo = 0x3f3f3f3f;

deque <int> mini, maxi;
int A[MAX][MAX], minm[MAX][MAX], maxm[MAX][MAX];
int N, M, T;

inline void solve (int x, int y, int &MIN, int &NR) {
    for (int i = 1; i <= M; ++i) {
        mini.clear (), maxi.clear ();
        for (int j = 1; j <= N; ++j) {
            for (; ! mini.empty () && A[i][j] <= A[i][mini.back ()]; mini.pop_back ());
            for (; ! maxi.empty () && A[i][j] >= A[i][maxi.back ()]; maxi.pop_back ());
            mini.push_back (j), maxi.push_back (j);

            if (mini.front () <= j - x) mini.pop_front ();
            if (maxi.front () <= j - x) maxi.pop_front ();

            minm[i][j] = A[i][mini.front ()];
            maxm[i][j] = A[i][maxi.front ()];
        }
    }
    for (int i = x; i <= N; ++i) {
        mini.clear (), maxi.clear ();
        for (int j = 1; j <= M; ++j) {
            for (; ! mini.empty () && minm[j][i] <= minm[mini.back ()][i]; mini.pop_back ());
            for (; ! maxi.empty () && maxm[j][i] >= maxm[maxi.back ()][i]; maxi.pop_back ());
            mini.push_back (j), maxi.push_back (j);

            if (mini.front () <= j - y) mini.pop_front ();
            if (maxi.front () <= j - y) maxi.pop_front ();

            if (j >= y) {
                int aux = maxm[maxi.front ()][i] - minm[mini.front ()][i];
                if (aux < MIN) MIN = aux, NR = 1;
                else if (aux == MIN) NR += 1;
            }
        }
    }
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d %d", &M, &N, &T);
    for (int i = 1; i <= M; ++i)
        for (int j = 1; j <= N; ++j)
            scanf ("%d", A[i] + j);
    for (int i = 1, x, y; i <= T; ++i) {
        scanf ("%d %d", &x, &y);
        int MIN = oo, NR = 0;
        solve (x, y, MIN, NR);
        if (x != y) solve (y, x, MIN, NR);
        printf ("%d %d\n", MIN, NR);
    }
}