Cod sursa(job #1813795)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 23 noiembrie 2016 12:14:01
Problema Struti Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <fstream>

#define Ndim 1002
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
short int A[Ndim][Ndim],DQ[Ndim],Aux[Ndim][Ndim],Mix[2][Ndim][Ndim],N,M,P,DX,DY,Min,nrsol;
void deque_line(int d,bool OK)
{
    int i,j;
    for(i=1;i<=N;i++)
    {
        int st=1,dr=1;
        DQ[0] = DQ[1] = 0;
        for(j=1;j<=M;j++)
        {
            if(DQ[dr] - DQ[st] + 1 >= d)
                st++;
            if(OK==1)
                while(dr>=st && A[i][j]>A[i][DQ[dr]])
                    dr--;
            else
                while(dr>=st && A[i][j]<A[i][DQ[dr]])
                    dr--;
            DQ[++dr] = j;

            Aux[i][j] = A[i][DQ[st]];
        }
    }
}
void deque_col(int d,int OK)
{
    int i,j;
    for(j=1;j<=M;j++)
    {
        int st=1,dr=1;
        DQ[1]= DQ[0] = 0;
        for(i=1;i<=N;i++)
        {
            if(DQ[dr] - DQ[st] + 1 >= d)
                st++;
            if(OK==1)
                while(dr>=st && Aux[i][j] > Aux[DQ[dr]][j])
                    dr--;
            else
                while(dr>=st && Aux[i][j] < Aux[DQ[dr]][j])
                    dr--;
            DQ[++dr] = i;

            Mix[OK][i][j] = Aux[DQ[st]][j];
        }
    }
}
int main()
{
    fin>>N>>M>>P;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            fin>>A[i][j];

    while(P--)
    {
        fin>>DX>>DY;
        deque_line(DX,1);
        deque_col(DY,1);
        deque_line(DX,0);
        deque_col(DY,0);
        Min = 8001;
        nrsol = 0;
        for(int i=DY;i<=N;i++)
            for(int j=DX;j<=M;j++)
                if(Min > Mix[1][i][j]-Mix[0][i][j])
                {
                    Min = Mix[1][i][j]-Mix[0][i][j];
                    nrsol = 1;
                }
                else if(Min == Mix[1][i][j]-Mix[0][i][j])
                    nrsol++;
        if(DX==DY)
        {
             fout<<Min<<' '<<nrsol<<'\n';
             continue;
        }
        deque_line(DY,1);
        deque_col(DX,1);
        deque_line(DY,0);
        deque_col(DX,0);
        for(int i=DX;i<=N;i++)
            for(int j=DY;j<=M;j++)
                if(Min > Mix[1][i][j]-Mix[0][i][j])
                {
                    Min = Mix[1][i][j]-Mix[0][i][j];
                    nrsol = 1;
                }
                else if(Min == Mix[1][i][j]-Mix[0][i][j])
                    nrsol++;
        fout<<Min<<' '<<nrsol<<'\n';
    }
    return 0;
}