Cod sursa(job #1958477)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 8 aprilie 2017 13:43:34
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
#include <algorithm>
#include <deque>
#define INF 2000000000
#define MaxN 1001
using namespace std;

int N,M,P,X1,X2,v[MaxN][MaxN]={},MaxL[MaxN][MaxN]={},MaxC[MaxN][MaxN]={},MinL[MaxN][MaxN]={},MinC[MaxN][MaxN]={},Min,cnt;
deque <int> Qmax;
deque <int> Qmin;
void Solve(int v1,int v2)
{
    for(int i=1;i<=N;i++)
    {
        Qmin.clear();
        Qmax.clear();
        for(int j=1;j<=M;j++)
        {
            while(!Qmax.empty()&&v[i][Qmax.back()]<v[i][j])
                Qmax.pop_back();
            Qmax.push_back(j);
            if(Qmax.front()<=j-v1)
                Qmax.pop_front();
            if(j-v1>=0)
                MaxL[i][j-v1+1]=v[i][Qmax.front()];
            while(!Qmin.empty()&&v[i][Qmin.back()]>v[i][j])
                Qmin.pop_back();
            Qmin.push_back(j);
            if(Qmin.front()<=j-v1)
                Qmin.pop_front();
            if(j-v1>=0)
                MinL[i][j-v1+1]=v[i][Qmin.front()];
        }
    }
    for(int j=1;j<=M-v1+1;j++)
    {
        Qmin.clear();
        Qmax.clear();
        for(int i=1;i<=N;i++)
        {
            while(!Qmax.empty()&&MaxL[Qmax.back()][j]<MaxL[i][j])
                Qmax.pop_back();
            Qmax.push_back(i);
            if(Qmax.front()<=i-v2)
                Qmax.pop_front();
            if(i-v2>=0)
                MaxC[i-v2+1][j]=MaxL[Qmax.front()][j];
            while(!Qmin.empty()&&MinL[Qmin.back()][j]>MinL[i][j])
                Qmin.pop_back();
            Qmin.push_back(i);
            if(Qmin.front()<=i-v2)
                Qmin.pop_front();
            if(i-v2>=0)
                MinC[i-v2+1][j]=MinL[Qmin.front()][j];
        }
    }
    for(int i=1;i<=N-v2+1;i++)
        for(int j=1;j<=M-v1+1;j++)
            if(Min>MaxC[i][j]-MinC[i][j])
                Min=MaxC[i][j]-MinC[i][j],cnt=1;
            else if(Min==MaxC[i][j]-MinC[i][j])
                cnt++;
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","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",&v[i][j]);
    for(int step=1;step<=P;step++)
    {
        scanf("%d%d",&X1,&X2);
        Min=INF,cnt=0;
        Solve(X1,X2);
        if(X1!=X2) Solve(X2,X1);
        printf("%d %d\n",Min,cnt);
    }
    return 0;
}