Cod sursa(job #915633)

Utilizator dariusdariusMarian Darius dariusdarius Data 15 martie 2013 10:31:27
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<deque>
using namespace std;
int n,m,p,q,a[1005][1005];
int ml[1005][1005];
int Ml[1005][1005];
int solve(int x,int y,int &nr)
{
    memset(ml,0,sizeof(ml));
    memset(Ml,0,sizeof(Ml));
    ///ml[i][j]=elementul minim de pe linia i, din intervalul j-y+1...j
    ///Ml[i][j]=elementul maxim de pe linia i, din intervalul j-y+1...j
    for(int i=1;i<=n;i++)
    {
        deque<int> Q,q;
        for(int j=1;j<=m;j++)
        {
            if(!q.empty() && j-q.front()==y)
                q.pop_front();
            if(!Q.empty() && j-Q.front()==y)
                Q.pop_front();
            while(!q.empty() && a[i][j]<=a[i][q.back()])
                q.pop_back();
            q.push_back(j);
            while(!Q.empty() && a[i][j]>=a[i][Q.back()])
                Q.pop_back();
            Q.push_back(j);
            if(j>=y)
                ml[i][j]=a[i][q.front()],
                Ml[i][j]=a[i][Q.front()];
        }
    }
    nr=0;int ans=8001;
    for(int j=y;j<=m;j++)
    {
        deque<int> Q,q;
        for(int i=1;i<=n;i++)
        {
            if(!q.empty() && i-q.front()==x)
                q.pop_front();
            if(!Q.empty() && i-Q.front()==x)
                Q.pop_front();
            while(!q.empty() && ml[i][j]<=ml[q.back()][j])
                q.pop_back();
            q.push_back(i);
            while(!Q.empty() && Ml[i][j]>=Ml[Q.back()][j])
                Q.pop_back();
            Q.push_back(i);
            if(i>=x)
                if(Ml[Q.front()][j]-ml[q.front()][j]<ans)
                    ans=Ml[Q.front()][j]-ml[q.front()][j],nr=1;
                else
                    if(Ml[Q.front()][j]-ml[q.front()][j]==ans)
                        nr++;
        }
    }
    return ans;
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    int k,i,j,M1,M2,nr1,nr2;
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=k;i++)
    {
        scanf("%d%d",&p,&q);
        M1=solve(p,q,nr1);
        M2=solve(q,p,nr2);
        if(M1<M2)
            printf("%d %d\n",M1,nr1);
        else
            if(M1>M2)
                printf("%d %d\n",M2,nr2);
            else
                if(p!=q)
                    printf("%d %d\n",M1,nr1+nr2);
                else
                    printf("%d %d\n",M1,nr1);
    }
    return 0;
}