Cod sursa(job #949688)

Utilizator poptibiPop Tiberiu poptibi Data 14 mai 2013 17:40:24
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define Nmax 1010
#define PI pair<int, int>
#define mp make_pair
#define Inf 0x3f3f3f3f

int N, M, X, Y, P, Min[Nmax][Nmax], Max[Nmax][Nmax];
int Dmin[Nmax], Dmax[Nmax], frontMin, frontMax, backMin, backMax;
int A[Nmax][Nmax];

PI Find(int X, int Y)
{
        int NowMin = Inf, Freq = 0;
        for(int j = 1; j <= M; ++ j)
        {
                frontMin = frontMax = 1;
                backMin = backMax = 0;
                for(int i = 1; i <= N; ++ i)
                {       
                        while(frontMin <= backMin && A[Dmin[backMin]][j] > A[i][j]) backMin --;
                        while(frontMax <= backMax && A[Dmax[backMax]][j] < A[i][j]) backMax --;
                        Dmin[++ backMin] = i;
                        Dmax[++ backMax] = i;
                        if(i - X == Dmin[frontMin]) frontMin ++;
                        if(i - X == Dmax[frontMax]) frontMax ++;
                        Min[i][j] = A[Dmin[frontMin]][j];
                        Max[i][j] = A[Dmax[frontMax]][j];
                }
        }
   
        for(int i = X; i <= N; ++ i)
        {
                frontMin = frontMax = 1;
                backMin = backMax = 0;
                for(int j = 1; j <= M; ++ j)
                {
                        while(frontMin <= backMin && Min[i][Dmin[backMin]] > Min[i][j]) backMin --;
                        while(frontMax <= backMax && Max[i][Dmax[backMax]] < Max[i][j]) backMax --;
                        Dmin[++backMin] = j;
                        Dmax[++backMax] = j;
                        if(j - Y == Dmin[frontMin]) frontMin ++;
                        if(j - Y == Dmax[frontMax]) frontMax ++;
                        if(j >= Y)
                        {
                                int Now = Max[i][Dmax[frontMax]] - Min[i][Dmin[frontMin]];
                                if(NowMin > Now) NowMin = Now, Freq = 1;
                                else if(NowMin == Now) Freq ++;
                        }       
                }
        }
        return mp(NowMin, Freq);
}

PI GetAns(int X, int Y)
{
        PI First = Find(X, Y), Second = Find(Y, X);
        if(First.first == Second.first && X != Y) return mp(First.first, First.second + Second.second);
        return min(First, Second);
}

int main()
{
        freopen("struti.in", "r", stdin);
        freopen("struti.out", "w", stdout);
        int i, j;
        scanf("%i %i %i", &N, &M, &P);
        for(i = 1; i <= N; ++ i)
                for(j = 1; j <= M; ++ j)
                        scanf("%i", &A[i][j]);
        for(i = 1; i <= P; ++ i)
        {
                scanf("%i %i", &X, &Y);
                PI Ans = GetAns(X, Y);
                printf("%i %i\n", Ans.first, Ans.second);
        }
        return 0;
}