Cod sursa(job #1067151)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 26 decembrie 2013 14:05:56
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.71 kb
#include<cstdio>
#include<algorithm>
#include<deque>
#include<cstring>
#define oo 100523
using namespace std;
int i,n,m,j,A[1010][1010],MAX[1010][1010],MIN[1010][1010],SOL[1010][1010],sol[1010][1010],val,poz,t,x,y,iul,nriul;
void rezolva();
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&n,&m,&t);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&A[i][j]);
    int MAX[1010][1010],MIN[1010][1010],SOL[1010][1010],sol[1010][1010];
    memset(SOL,0,sizeof(SOL));
    memset(MAX,0,sizeof(SOL));
    memset(sol,0,sizeof(SOL));
    memset(MIN,0,sizeof(SOL));
    for(;t;--t)
    {
        scanf("%d%d",&x,&y);

        rezolva();
        iul=oo;nriul=0;
        for(i=y;i<=n;i++)
            for(j=x;j<=m;j++)
            {
                if(iul>SOL[i][j]-sol[i][j])
                {
                    iul=SOL[i][j]-sol[i][j];
                    nriul=1;
                    continue;
                }
                if(iul==SOL[i][j]-sol[i][j])++nriul;
            }
        if(x!=y){
        swap(x,y);
        rezolva();
        for(i=y;i<=n;i++)
            for(j=x;j<=m;j++)
            {
                if(iul>SOL[i][j]-sol[i][j]){iul=SOL[i][j]-sol[i][j];nriul=1;continue;}
                if(iul==SOL[i][j]-sol[i][j])++nriul;
            }
        }
        printf("%d %d\n",iul,nriul);
    }
    return 0;
}
void rezolva()
{
    deque<pair<int,int> >Q;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            for(;!Q.empty();)
            {
                val=Q.back().first;
                if(val<=A[i][j]){Q.pop_back();continue;}
                break;
            }
            Q.push_back(make_pair(A[i][j],j));
            for(;!Q.empty();)
            {
                poz=Q.front().second;
                if(poz<j-x+1){Q.pop_front();continue;}
                break;
            }
            MAX[i][j]=Q.front().first;
        }
        Q.resize(0);
    }
    for(j=x;j<=m;j++)
    {
        for(i=1;i<=n;i++)
        {
            for(;!Q.empty();)
            {
                val=Q.back().first;
                if(val<=MAX[i][j]){Q.pop_back();continue;}
                break;
            }
            Q.push_back(make_pair(MAX[i][j],i));
            for(;!Q.empty();)
            {
                poz=Q.front().second;
                if(poz<i-y+1){Q.pop_front();continue;}
                break;
            }
            if(i>=y)SOL[i][j]=Q.front().first;
        }
        Q.resize(0);
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            for(;!Q.empty();)
            {
                val=Q.back().first;
                if(val>=A[i][j]){Q.pop_back();continue;}
                break;
            }
            Q.push_back(make_pair(A[i][j],j));
            for(;!Q.empty();)
            {
                poz=Q.front().second;
                if(poz<j-x+1){Q.pop_front();continue;}
                break;
            }
            MIN[i][j]=Q.front().first;
        }
        Q.resize(0);
    }
    //for(i=1;i<=n;i++)
    //for(j=1;j<=m;j++)
    for(j=x;j<=m;j++)
    {
        for(i=1;i<=n;i++)
        {
            for(;!Q.empty();)
            {
                val=Q.back().first;
                if(val>=MIN[i][j]){Q.pop_back();continue;}
                break;
            }
            Q.push_back(make_pair(MIN[i][j],i));
            for(;!Q.empty();)
            {
                poz=Q.front().second;
                if(poz<i-y+1){Q.pop_front();continue;}
                break;
            }
            if(i>=y)sol[i][j]=Q.front().first;
        }
        Q.resize(0);
    }
}