Cod sursa(job #47468)

Utilizator damaDamaschin Mihai dama Data 3 aprilie 2007 18:58:29
Problema Struti Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.47 kb
#include <stdio.h>
#define nm 1024


short int n, m, p, sol, nr, mat[nm][nm], max1[nm][nm], max2[nm][nm], min1[nm][nm], min2[nm][nm];

void f(short int, short int);

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

    short int i, j, a, b, test;

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

    for(i = 1; i <= n; ++i)
    {
        for(j = 1; j <= m; ++j)
        {
            scanf("%hd", &mat[i][j]);
        }
    }

    for(test = 0; test < p; ++test)
    {
        sol = 8001;
        scanf("%hd%hd", &a, &b);
        f(a, b);
        if(a != b)
            f(b, a);
            /*
        for(i = 1; i <= n; ++i)
        {
            for(j = 1; j <= m; ++j)
            {
                printf("%d ", max2[i][j]);
            }
            printf("\n");
        }
        */
        printf("%hd %hd\n", sol, nr);
    }

    return 0;
}

void f(short int dx, short int dy)
{
            short int st[nm], i, first, last, j;
            st[0] = 0;

            for(i = 1; i <= n; ++i)
            {
                first = 1;
                last = 0;
                for(j = 1; j <= dx; ++j)
                {
                    while(mat[i][st[last]] < mat[i][j] && last >= first)
                        --last;
                    st[++last] = j;
                }
                max1[i][1] = mat[i][st[first]];
                for(j = dx + 1; j <= m; ++j)
                {
                    if(j - st[first] >= dx)
                        ++first;
                    while(mat[i][j] > mat[i][st[last]] && last >= first)
                        --last;
                    st[++last] = j;
                    max1[i][j - dx + 1] = mat[i][st[first]];
                }
            }

            for(i = 1; i <= m - dx + 1; ++i)
            {
                first = 1;
                last = 0;
                for(j = 1; j <= dy; ++j)
                {
                    while(max1[j][i] > max1[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                }
                max2[1][i] = max1[st[first]][i];
                for(j = dy + 1; j <= n; ++j)
                {
                    if(j - st[first] >= dy)
                        ++first;
                    while(max1[j][i] > max1[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                    max2[j - dy + 1][i] = max1[st[first]][i];
                }
            }
            for(i = 1; i <= n; ++i)
            {
                first = 1;
                last = 0;
                for(j = 1; j <= dx; ++j)
                {
                    while(mat[i][st[last]] > mat[i][j] && last >= first)
                        --last;
                    st[++last] = j;
                }
                min1[i][1] = mat[i][st[first]];
                for(j = dx + 1; j <= m; ++j)
                {
                    if(j - st[first] >= dx)
                        ++first;
                    while(mat[i][j] < mat[i][st[last]] && last >= first)
                        --last;
                    st[++last] = j;
                    min1[i][j - dx + 1] = mat[i][st[first]];
                }
            }

            for(i = 1; i <= m - dx + 1; ++i)
            {
                first = 1;
                last = 0;
                for(j = 1; j <= dy; ++j)
                {
                    while(min1[j][i] < min1[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                }
                min2[1][i] = min1[st[first]][i];
                for(j = dy + 1; j <= n; ++j)
                {
                    if(j - st[first] >= dy)
                        ++first;
                    while(min1[j][i] < min1[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                    min2[j - dy + 1][i] = min1[st[first]][i];
                }
            }

            for(i = 1; i <= n - dy + 1; ++i)
            {
                for(j = 1; j <= m - dx + 1; ++j)
                {
                    if(max2[i][j] - min2[i][j] == sol)
                        ++nr;
                    if(max2[i][j] - min2[i][j] < sol)
                    {
                        sol = max2[i][j] - min2[i][j];
                        nr = 1;
                    }
                }
            }
}