Cod sursa(job #1160406)

Utilizator j.loves_rockJessica Joanne Patrascu j.loves_rock Data 30 martie 2014 15:33:31
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<stdio.h>
#include<deque>
#define INF 1002

using namespace std;

int h[INF][INF],Max[INF][INF],Min[INF][INF],n,m,p,minH,nr;
deque<int> maxQ,minQ;

void getRas(int r,int c)
{
    for(int i=0; i<n; ++i)
    {
        minQ.clear();
        maxQ.clear();
        for(int j=0; j<m; ++j)
        {
            while(minQ.size()>0 && h[i][j]<=h[i][minQ.back()])minQ.pop_back();
            minQ.push_back(j);
            if(minQ.front()<=j-c)minQ.pop_front();
            if(j>=c-1)Min[i][j]=h[i][minQ.front()];

            while(maxQ.size()>0 && h[i][j]>=h[i][maxQ.back()])maxQ.pop_back();
            maxQ.push_back(j);
            if(maxQ.front()<=j-c)maxQ.pop_front();
            if(j>=c-1)Max[i][j]=h[i][maxQ.front()];
        }
    }

    for(int j=c-1; j<m; ++j)
    {
        minQ.clear();
        maxQ.clear();
        for(int  i=0; i<n; ++i)
        {
            while(minQ.size()>0 && Min[i][j]<=Min[minQ.back()][j])minQ.pop_back();
            minQ.push_back(i);
            if(minQ.front()<=i-r)minQ.pop_front();

            while(maxQ.size()>0 && Max[i][j]>=Max[maxQ.back()][j])maxQ.pop_back();
            maxQ.push_back(i);
            if(maxQ.front()<=i-r)maxQ.pop_front();

            if(i>=r-1)
            {
                if(Max[maxQ.front()][j]-Min[minQ.front()][j]<minH)
                {
                    minH=Max[maxQ.front()][j]-Min[minQ.front()][j];
                    nr=1;
                }
                else if(Max[maxQ.front()][j]-Min[minQ.front()][j]==minH)nr++;
            }
        }
    }
}

int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    for(int i=0; i<n; ++i)
        for(int j=0; j<m; ++j)scanf("%d",&h[i][j]);
    for(int i=0; i<p; ++i)
    {
        int c,r;
        minH=9999999999999999;
        scanf("%d%d",&c,&r);
        getRas(r,c);
        if(c!=r)getRas(c,r);
        printf("%d %d\n",minH,nr);
    }
    return 0;
}