Cod sursa(job #1065241)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 23 decembrie 2013 00:02:28
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.93 kb
#include<cstdio>
#include<deque>
#include<utility>

using namespace std;

typedef pair<int,int> PII;
const int NMAX = 1005;
const int MMAX = 1005;
const int oo = (1<<31)-1;

int N,M,P,Dx,Dy;
int A[NMAX][MMAX];

int solve(int X,int Y,int &NR)
{
    int MIN,i,j,d;
    NR=0;
    MIN=oo;
    if(X>N || Y>M) return 0;
    deque<PII> ColMin[MMAX],ColMax[MMAX];
    deque<PII> LinMin[NMAX],LinMax[NMAX];
    /*for(j=1;j<=M;j++)
    {
        ColMax[j].resize(0);
        ColMin[j].resize(0);
    }*/
    for(j=1;j<=M;j++)
        for(i=1;i<=X-1;i++)
        {
            for(;!ColMax[j].empty() && ColMax[j].back().second<=A[i][j];) ColMax[j].pop_back();
            ColMax[j].push_back(make_pair(i,A[i][j]));

            for(;!ColMin[j].empty() && ColMin[j].back().second>=A[i][j];) ColMin[j].pop_back();
            ColMin[j].push_back(make_pair(i,A[i][j]));
        }
    for(;i<=N;i++)
    {
        //LinMax[i].resize(0);
        //LinMin[i].resize(0);
        for(j=1;j<=M;j++)
        {
            for(;!ColMax[j].empty() && ColMax[j].back().second<=A[i][j];) ColMax[j].pop_back();
            ColMax[j].push_back(make_pair(i,A[i][j]));
            for(;ColMax[j].front().first<=i-X;) ColMax[j].pop_front();

            for(;!ColMin[j].empty() && ColMin[j].back().second>=A[i][j];) ColMin[j].pop_back();
            ColMin[j].push_back(make_pair(i,A[i][j]));
            for(;ColMin[j].front().first<=i-X;) ColMin[j].pop_front();

            for(;!LinMax[i].empty() && LinMax[i].back().second<=ColMax[j].front().second;) LinMax[i].pop_back();
            LinMax[i].push_back(make_pair(j,ColMax[j].front().second));
            for(;LinMax[i].front().first<=j-Y;) LinMax[i].pop_front();

            for(;!LinMin[i].empty() && LinMin[i].back().second>=ColMin[j].front().second;) LinMin[i].pop_back();
            LinMin[i].push_back(make_pair(j,ColMin[j].front().second));
            for(;LinMin[i].front().first<=j-Y;) LinMin[i].pop_front();

            if(j>=Y)
            {
                d=LinMax[i].front().second-LinMin[i].front().second;
                if(d<MIN) {MIN=d; NR=0;}
                if(d==MIN) NR++;
            }
        }
    }
    return MIN;
}

int main()
{
    int i,j;

    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&N,&M,&P);
    for(i=1;i<=N;i++)
        for(j=1;j<=M;j++)
            scanf("%d",&A[i][j]);

    int MIN1,MIN2;
    int NR1,NR2;
    int sol1,sol2;

    for(;P;--P)
    {
        scanf("%d%d",&Dx,&Dy);
        MIN1=solve(Dx,Dy,NR1);
        if(Dx!=Dy)
        {
            MIN2=solve(Dy,Dx,NR2);
            if(MIN1<MIN2) {sol1=MIN1; sol2=NR1;}
            if(MIN1>MIN2) {sol1=MIN2; sol2=NR2;}
            if(MIN1==MIN2) {sol1=MIN1; sol2=NR1+NR2;}
        }
        else
        {
            sol1=MIN1;
            sol2=NR1;
        }
        printf("%d %d\n",sol1,sol2);
    }
    return 0;
}