Cod sursa(job #1062029)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 20 decembrie 2013 17:16:47
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include<cstdio>
#include<deque>
#define pb push_back
#define mp make_pair
#define PII pair<int,int>
#define x first
#define y second
using namespace std;
const int NMAX = 1005;
const int DIM = 10000;
int N,M,Q,i,j,A[NMAX][NMAX],SOL,Cnt,SAux,CntAux,SAux2,CntAux2,X,Y,poz=0;
char buff[DIM];
deque<PII> SCM[NMAX],SCm[NMAX],SLM,SLm;
void Read(int &X)
{
    X=0;
    while(buff[poz]<'0' || buff[poz]>'9')
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    while(buff[poz]>='0' && buff[poz]<='9')
    {
        X=X*10+buff[poz]-'0';
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    }
}
int Solve(int X,int Y)
{
    int Dif; SOL=1<<30; Cnt=0;
    if(X>N || Y>M) return 0;
    for(j=1;j<=M;j++) SCM[j].clear(),SCm[j].clear();
    for(j=1;j<=M;j++)
        for(i=1;i<X;i++)
        {
            while(!SCM[j].empty() && A[i][j]>=SCM[j].back().x) SCM[j].pop_back();
            SCM[j].pb(mp(A[i][j],i));

            while(!SCm[j].empty() && A[i][j]<=SCm[j].back().x) SCm[j].pop_back();
            SCm[j].pb(mp(A[i][j],i));
        }
    for(i=X;i<=N;i++)
    {
        SLM.clear(); SLm.clear();
        for(j=1;j<=M;j++)
        {
            while(!SCM[j].empty() && A[i][j]>=SCM[j].back().x) SCM[j].pop_back();
            SCM[j].pb(mp(A[i][j],i));
            if(SCM[j].front().y==i-X) SCM[j].pop_front();

            while(!SCm[j].empty() && A[i][j]<=SCm[j].back().x) SCm[j].pop_back();
            SCm[j].pb(mp(A[i][j],i));
            if(SCm[j].front().y==i-X) SCm[j].pop_front();

            while(!SLM.empty() && SCM[j].front().x>=SLM.back().x) SLM.pop_back();
            SLM.pb(mp(SCM[j].front().x,j));
            if(SLM.front().y==j-Y) SLM.pop_front();

            while(!SLm.empty() && SCm[j].front().x<=SLm.back().x) SLm.pop_back();
            SLm.pb(mp(SCm[j].front().x,j));
            if(SLm.front().y==j-Y) SLm.pop_front();

            if(j>=Y)
            {
                Dif=SLM.front().x-SLm.front().x;
                if(Dif<SOL) {SOL=Dif; Cnt=1;}
                else if(Dif==SOL) Cnt++;
            }
        }
    }
    return SOL;
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    Read(N); Read(M); Read(Q);
    for(i=1;i<=N;i++)
        for(j=1;j<=M;j++) Read(A[i][j]);
    for(;Q;Q--)
    {
        Read(X); Read(Y);
        SAux=Solve(X,Y); CntAux=Cnt;
        if(X!=Y) SAux2=Solve(Y,X),CntAux2=Cnt;
        else SAux2=1<<30;
        if(SAux<SAux2) printf("%d %d\n",SAux,CntAux);
        else if(SAux>SAux2) printf("%d %d\n",SAux2,CntAux2);
        else printf("%d %d\n",SAux,CntAux+CntAux2);
    }
    return 0;
}