Cod sursa(job #1076989)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 10 ianuarie 2014 19:47:52
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <cstdio>

int N, M, T, rez, cnt;
const int Nmax=1005;
int d_min[Nmax], d_max[Nmax];
int a[Nmax][Nmax], b[Nmax][Nmax], minim[Nmax][Nmax], maxim[Nmax][Nmax], c[1005][1005];
void solve(int X, int Y){
    int i, j, p_min, u_min, p_max, u_max;
    for (i = 1; i <= N; i++){
        p_min = p_max = 1; u_min = u_max = 0;
        for (j = 1; j <= M; j++){
            while (u_min >= p_min && b[i][j] < b[i][ d_min[u_min] ]) u_min--;
            d_min[ ++u_min ] = j;

            while (u_max >= p_max && b[i][j] > b[i][ d_max[u_max] ]) u_max--;
            d_max[ ++u_max ] = j;

            if (d_min[p_min] == j - Y) p_min++;
            if (d_max[p_max] == j - Y) p_max++;

            if (j >= Y){
                minim[i][j - Y + 1] = b[i][ d_min[p_min] ];
                maxim[i][j - Y + 1] = b[i][ d_max[p_max] ];
            }
        }
    }

    M -= (Y - 1);
    for (j = 1; j <= M; j++){
        p_min = p_max = 1; u_min = u_max = 0;

        for (i = 1; i <= N; i++){
            while (u_min >= p_min && minim[i][j] < minim[ d_min[u_min] ][j]) u_min--;
            d_min[ ++u_min ] = i;

            while (u_max >= p_max && maxim[i][j] > maxim[ d_max[u_max] ][j]) u_max--;
            d_max[ ++u_max ] = i;

            if (d_min[p_min] == i - X) p_min++;
            if (d_max[p_max] == i - X) p_max++;

            if (i >= X)  c[i - X + 1][j] = maxim[ d_max[p_max] ][j] - minim[d_min[p_min] ][j];
        }
    }
    N -= (X - 1);
    for (i = 1; i <= N; i++)
        for (j = 1; j <= M; j++){
            if (c[i][j] < rez) rez = c[i][j], cnt = 1;
            else if (c[i][j] == rez) cnt++;
        }
}

int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);

    int i, j, X, Y, MM, NN;

    scanf("%d %d %d",&N,&M,&T);
    NN = N; MM = M;
    for (i = 1; i <= N; i++)
        for (j = 1; j <= M; j++) scanf("%d",&a[i][j]);

    while (T--){
        for (i = 1; i <= N; i++)
            for (j = 1; j <= M; j++) b[i][j] = a[i][j];

        scanf("%d %d",&X,&Y);

        rez = 200000; cnt = 0;

        N = NN; M = MM;
        solve(X, Y);

        if (X != Y){
            N = NN; M = MM;
            solve(Y, X);
        }
        printf("%d %d\n", rez, cnt);
    }
    return 0;
}