Cod sursa(job #1338072)

Utilizator akaprosAna Kapros akapros Data 9 februarie 2015 19:27:28
Problema Struti Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#define Nmax 1005
using namespace std;
deque < int >dc,ec;
deque < int >dl,el;
int n,m,i,j,p,q,nr,t,dx,dy,sol;
int a[Nmax][Nmax],d[Nmax][Nmax],e[Nmax][Nmax];
void solve (int dx,int dy)
{
    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);
    for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
    scanf("%d",&a[i][j]);
    while (t--)
    {
        scanf("%d %d",&dx,&dy); sol=2000000000;
        solve(dx,dy);
        dc.clear(); dl.clear();
        ec.clear(); el.clear();
        dl.pop_front();
        if (dy!=dx) solve(dy,dx);
        printf("%d %d\n",sol,nr);
    }
    return 0;
}