Cod sursa(job #1062018)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 20 decembrie 2013 17:09:47
Problema Struti Scor 80
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.42 kb
#include<cstdio>
#include<deque>
#define pb push_back
#define mp make_pair
#define PII pair<int,int>
#define x first
#define y second
using namespace std;
const int NMAX = 1005;
int N,M,Q,i,j,A[NMAX][NMAX],SOL,Cnt,SAux,CntAux,SAux2,CntAux2,X,Y;
deque<PII> SCM[NMAX],SCm[NMAX],SLM,SLm;
int Solve(int X,int Y)
{
    int Dif; SOL=1<<30; Cnt=0;
    if(X>N || Y>M) return 0;
    for(j=1;j<=M;j++) SCM[j].clear(),SCm[j].clear();
    for(j=1;j<=M;j++)
        for(i=1;i<=X;i++)
        {
            while(!SCM[j].empty() && A[i][j]>=SCM[j].back().x) SCM[j].pop_back();
            SCM[j].pb(mp(A[i][j],i));

            while(!SCm[j].empty() && A[i][j]<=SCm[j].back().x) SCm[j].pop_back();
            SCm[j].pb(mp(A[i][j],i));
        }
    for(i=X;i<=N;i++)
    {
        if(i>X)
            for(j=1;j<=M;j++)
            {
                while(!SCM[j].empty() && A[i][j]>=SCM[j].back().x) SCM[j].pop_back();
                SCM[j].pb(mp(A[i][j],i));
                if(SCM[j].front().y==i-X) SCM[j].pop_front();

                while(!SCm[j].empty() && A[i][j]<=SCm[j].back().x) SCm[j].pop_back();
                SCm[j].pb(mp(A[i][j],i));
                if(SCm[j].front().y==i-X) SCm[j].pop_front();
            }

        SLM.clear(); SLm.clear();
        for(j=1;j<=M;j++)
        {
            while(!SLM.empty() && SCM[j].front().x>=SLM.back().x) SLM.pop_back();
            SLM.pb(mp(SCM[j].front().x,j));
            if(SLM.front().y==j-Y) SLM.pop_front();

            while(!SLm.empty() && SCm[j].front().x<=SLm.back().x) SLm.pop_back();
            SLm.pb(mp(SCm[j].front().x,j));
            if(SLm.front().y==j-Y) SLm.pop_front();

            if(j>=Y)
            {
                Dif=SLM.front().x-SLm.front().x;
                if(Dif<SOL) {SOL=Dif; Cnt=1;}
                else if(Dif==SOL) Cnt++;
            }
        }
    }
    return SOL;
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&N,&M,&Q);
    for(i=1;i<=N;i++)
        for(j=1;j<=M;j++) scanf("%d",&A[i][j]);
    for(;Q;Q--)
    {
        scanf("%d%d",&X,&Y);
        SAux=Solve(X,Y); CntAux=Cnt;
        if(X!=Y) SAux2=Solve(Y,X),CntAux2=Cnt;
        else SAux2=1<<30;
        if(SAux<SAux2) printf("%d %d\n",SAux,CntAux);
        else if(SAux>SAux2) printf("%d %d\n",SAux2,CntAux2);
        else printf("%d %d\n",SAux,CntAux+CntAux2);
    }
    return 0;
}