Cod sursa(job #1338110)

Utilizator akaprosAna Kapros akapros Data 9 februarie 2015 19:52:17
Problema Struti Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#define Nmax 1005
using namespace std;
int n,m,nr,t,dx,dy,sol;
int a[Nmax][Nmax],e[Nmax][Nmax],d[Nmax][Nmax];
void citire()
{
    int i,j;
    for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
    scanf("%d",&a[i][j]);
}
void solve (int dx,int dy)
{
    int i,j,p,q;
    deque < int >dc,ec,dl,el;
    dc.clear(); dl.clear();
    ec.clear(); el.clear();
    for (i=1;i<=n;++i)
        {
            dc.clear(); ec.clear();
            for (j=1;j<=m;j++)
            {
                while (!dc.empty() && a[i][dc.back()]>a[i][j])
                dc.pop_back();
                dc.push_back(j);
                if (j-dc.front()==dx) dc.pop_front();
                d[i][j]=dc.front();

                while (!ec.empty() && a[i][ec.back()]<a[i][j])
                ec.pop_back();
                ec.push_back(j);
                if (j-ec.front()==dx) ec.pop_front();
                e[i][j]=ec.front();
            }
        }
        dl.clear(); el.clear();
        for (j=1;j<=m;j++)
        {
            dl.clear(); el.clear();
        for (i=1;i<=n;i++)
        {
            while (!dl.empty() && a[dl.back()][d[dl.back()][j]]>a[i][d[i][j]])
            dl.pop_back();
            dl.push_back(i);
            if (i-dl.front()==dy) dl.pop_front();
            while (!el.empty() && a[el.back()][e[el.back()][j]]<=a[i][e[i][j]])
            el.pop_back();
            el.push_back(i);
            if (i-el.front()==dy) el.pop_front();
            if (i>=dy && j>=dx)
            {
                p=a[el.front()][e[el.front()][j]];
                q=a[dl.front()][d[dl.front()][j]];
                if (p-q<sol)
                sol=p-q,nr=1; else
                if (p-q==sol)
                ++nr;
            }
        }
        }
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d %d %d",&n,&m,&t); t++;
    citire();
    while (--t)
    {
        scanf("%d %d",&dx,&dy); sol=2000000000;
        solve(dx,dy);
        if (dy!=dx) solve(dy,dx);
        printf("%d %d\n",sol,nr);
    }
    return 0;
}