Cod sursa(job #79563)

Utilizator sealTudose Vlad seal Data 23 august 2007 01:42:12
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
using namespace std;
#include<cstdio>
#include<deque>
#define Nm 1000
#define Inf 8001
int M[Nm][Nm],n,m,p;
deque<int> Minc[Nm],Maxc[Nm],Min,Max;

void read()
{
    int i,j;

    freopen("struti.in","r",stdin);
    scanf("%d%d%d",&n,&m,&p);
    for(i=0;i<n;++i)
        for(j=0;j<m;++j)
            scanf("%d",&M[i][j]);
}

int difmin,nr;

void query(int a, int b)
{
    int i,j,dif;

    for(j=0;j<m;++j)
    {
        Minc[j].clear();
        Maxc[j].clear();
    }

    for(i=0;i<n;++i)
    {
        Min.clear();
        Max.clear();
        for(j=0;j<m;++j)
        {
            while(!Minc[j].empty() && M[i][j]<M[Minc[j].back()][j])
                Minc[j].pop_back();
            Minc[j].push_back(i);
            
            while(!Maxc[j].empty() && M[i][j]>M[Maxc[j].back()][j])
                Maxc[j].pop_back();
            Maxc[j].push_back(i);

            if(i>=a-1)
            {
                if(Minc[j].front()==i-a)
                    Minc[j].pop_front();
                if(Maxc[j].front()==i-a)
                    Maxc[j].pop_front();

                while(!Min.empty() && M[Minc[j].front()][j]<M[Minc[Min.back()].front()][Min.back()])
                    Min.pop_back();
                Min.push_back(j);

                while(!Max.empty() && M[Maxc[j].front()][j]>M[Maxc[Max.back()].front()][Max.back()])
                    Max.pop_back();
                Max.push_back(j);

                if(j>=b-1)
                {
                    if(Min.front()==j-b)
                        Min.pop_front();
                    if(Max.front()==j-b)
                        Max.pop_front();
                        
                    dif=M[Maxc[Max.front()].front()][Max.front()]-M[Minc[Min.front()].front()][Min.front()];
                    if(dif==difmin)
                        ++nr;
                    else
                        if(dif<difmin)
                        {
                            difmin=dif;
                            nr=1;
                        }
                }
            }
        }
    }
}

void solve()
{
    int a,b;

    freopen("struti.out","w",stdout);
    while(p--)
    {
        scanf("%d%d",&a,&b);
        difmin=Inf;
        query(a,b);
        if(a!=b)
            query(b,a);
        printf("%d %d\n",difmin,nr);
    }
}

int main()
{
    read();
    solve();
    return 0;
}