Cod sursa(job #47479)

Utilizator damaDamaschin Mihai dama Data 3 aprilie 2007 19:07:04
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.18 kb
#include <stdio.h>
#define nm 1024

int n, m, p, sol, nr, mat[nm][nm], tmp[nm][nm], max2[nm][nm], min2[nm][nm];

void f(int, int);

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

    int i, j, a, b, test;

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

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

    for(test = 0; test < p; ++test)
    {
        sol = 8001;
        scanf("%d%d", &a, &b);
        f(a, b);
        if(a != b)
            f(b, a);
        printf("%d %d\n", sol, nr);
    }

    return 0;
}

void f(int dx, int dy)
{
            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;
                }
                tmp[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;
                    tmp[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(tmp[j][i] > tmp[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                }
                max2[1][i] = tmp[st[first]][i];
                for(j = dy + 1; j <= n; ++j)
                {
                    if(j - st[first] >= dy)
                        ++first;
                    while(tmp[j][i] > tmp[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                    max2[j - dy + 1][i] = tmp[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;
                }
                tmp[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;
                    tmp[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(tmp[j][i] < tmp[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                }
                min2[1][i] = tmp[st[first]][i];
                for(j = dy + 1; j <= n; ++j)
                {
                    if(j - st[first] >= dy)
                        ++first;
                    while(tmp[j][i] < tmp[st[last]][i] && last >= first)
                        --last;
                    st[++last] = j;
                    min2[j - dy + 1][i] = tmp[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;
                    }
                }
            }
}