Cod sursa(job #255732)

Utilizator gh09chisinau gheorghita gh09 Data 10 februarie 2009 15:23:49
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
# include <cstdio>

# define FIN "struti.in"
# define FOUT "struti.out"
# define MAXN 1005

int N, M, P, DX, DY, Sol1, Sol2;
int X[MAXN];
int Deque[MAXN];
int A[MAXN][MAXN];
int MN[MAXN][MAXN];
int MX[MAXN][MAXN];

    void BST(int DX, int DY)
    {
        for (int i = DX; i <= N; ++i)
          for (int j = DY; j <= M; ++j)
          {
             if (MX[i][j] - MN[i][j] == Sol1) Sol2++;
             if (MX[i][j] - MN[i][j] < Sol1)
             {
                Sol1 = MX[i][j] - MN[i][j];
                Sol2 = 1;
             }
          }
    }

    void compute(int DX, int DY)
    {
        int i, j, begin, end;
        
        for (i = 1; i <= N; ++i)
        {
            begin = 1; end = 0;
            for (j = 1; j <= M; ++j)
            {
                for (; begin <= end && X[end] < A[i][j]; --end);
                Deque[++end] = j;
                X[end] = A[i][j];
                if (Deque[begin] < j - DY + 1) ++begin;
                MX[i][j] = X[begin];
            }
        }
        for (i = 1; i <= M; ++i)
        {
            begin = 1; end = 0;
            for (j = 1; j <= N; ++j)
            {
                for (; begin <= end && X[end] < MX[j][i]; --end);
                Deque[++end] = j;
                X[end] = MX[j][i];
                if (Deque[begin] < j - DX + 1) ++begin;
                MX[j][i] = X[begin];
            }
        }
        
        for (i = 1; i <= N; ++i)
        {
            begin = 1; end = 0;
            for (j = 1; j <= M; ++j)
            {
                for (; begin <= end && X[end] > A[i][j]; --end);
                Deque[++end] = j;
                X[end] = A[i][j];
                if (Deque[begin] < j - DY + 1) ++begin;
                MN[i][j] = X[begin];
            }
        }
        for (i = 1; i <= M; ++i)
        {
            begin = 1; end = 0;
            for (j = 1; j <= N; ++j)
            {
                for (; begin <= end && X[end] > MN[j][i]; --end);
                Deque[++end] = j;
                X[end] = MN[j][i];
                if (Deque[begin] < j - DX + 1) ++begin;
                MN[j][i] = X[begin];
            }
        }
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d%d%d",&N,&M,&P);
        for (int i = 1; i <= N; ++i)
          for (int j = 1; j <= M; ++j)
            scanf("%d",&A[i][j]);
            
        for (int i = 1; i <= P; ++i)
        {
            scanf("%d%d",&DX,&DY);
            
            Sol1 = 10000; Sol2 = 0;
            
            compute(DX, DY);  BST(DX, DY);
            if (DX != DY)
            compute(DY, DX),  BST(DY, DX);
            
            printf("%d %d\n",Sol1,Sol2);
        }
        
        return 0;
    }