Cod sursa(job #913027)

Utilizator assa98Andrei Stanciu assa98 Data 13 martie 2013 07:57:14
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;

struct sp
{
    int a;
    int b;
    sp()
    {
        a=0;
        b=0;
    }
    sp(int x,int y)
    {
        a=x;
        b=y;
    }
};

int x[1010][1010];

int xmin[1010][1010];
int xmax[1010][1010];

int n,m,p;

void compute(int k)
{
    memset(xmin,0,sizeof(xmin));
    memset(xmax,0,sizeof(xmax));
    for(int j=1; j<=m; j++)
    {
        deque<int> d1;
        deque<int> d2;
        for(int i=1; i<=n; i++)
        {
            while(!d1.empty()&&i-d1.front()>=k)
                d1.pop_front();
            while(!d1.empty()&&x[i][j]<x[d1.back()][j])
                d1.pop_back();
            d1.push_back(i);
            xmin[i][j]=x[d1.front()][j];


            while(!d2.empty()&&i-d2.front()>=k)
                d2.pop_front();
            while(!d2.empty()&&x[i][j]>x[d2.back()][j])
                d2.pop_back();
            d2.push_back(i);
            xmax[i][j]=x[d2.front()][j];
        }
    }

}



sp solve(int l,int c)
{
    compute(l);
    int sol=32000;
    int count=0;
    for(int i=l; i<=n; i++)
    {
        deque<int> d1;
        deque<int> d2;
        for(int j=1; j<=m; j++)
        {
            while(!d1.empty()&&i-d1.front()>=c)
                d1.pop_front();
            while(!d1.empty()&&xmin[i][j]<xmin[i][d1.back()])
                d1.pop_back();
            d1.push_back(j);

            while(!d2.empty()&&i-d2.front()>=c)
                d2.pop_front();
            while(!d2.empty()&&xmax[i][j]>xmax[i][d2.back()])
                d2.pop_back();
            d2.push_back(j);

            if(j>=c)
            {
                int a=xmax[i][d2.front()]-xmin[i][d1.front()];
                if(a==sol)
                    count++;
                else if(a<sol)
                {
                    sol=a;
                    count=1;
                }
            }

        }
    }
    return sp(sol,count);
}
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",&x[i][j]);
        }
    for(int i=1; i<=p; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        sp rez=solve(a,b);
        printf("%d %d\n",rez.a,rez.b);
    }
    return 0;
}