Cod sursa(job #2079014)

Utilizator RaduGiucleaGiuclea Radu RaduGiuclea Data 30 noiembrie 2017 13:51:27
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.44 kb
#include <cstdio>
#include <deque>
using namespace std;
struct aa
{
    int c;
    int v;
};
int a[1002][1002],mic[1002][1002],mare[1002][1002],n,m;
void solve(int k1,int k2)
{
    deque <aa> mn[1002],mx[1002];
    int i,j,req1=2000000000,nr1,m2;
    aa x,mini,maxi;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            x.v=a[i][j];
            x.c=j;
            while(!mn[i].empty()&&mn[i].back().v>=x.v)
                mn[i].pop_back();
            mn[i].push_back(x);
            while(!mx[i].empty()&&mx[i].back().v<=x.v)
                mx[i].pop_back();
            mx[i].push_back(x);
            if(mn[i].front().c==j-k1)
                mn[i].pop_front();
            if(mx[i].front().c==j-k1)
                mx[i].pop_front();
            if(j>=k1)
            {
                mic[i][j-k1+1]=mn[i].front().v;
                mare[i][j-k1+1]=mx[i].front().v;
            }
        }
        mn[i].clear();
        mx[i].clear();
    }
    m2=m-k1+1;
    for(i=1; i<=m2; i++)
    {
        for(j=1; j<=n; j++)
        {
            mini.v=mic[j][i];
            maxi.v=mare[j][i];
            mini.c=j;
            maxi.c=j;
            while(!mn[i].empty()&&mn[i].back().v>=mini.v)
                mn[i].pop_back();
            mn[i].push_back(mini);
            while(!mx[i].empty()&&mx[i].back().v<=maxi.v)
                mx[i].pop_back();
            mx[i].push_back(maxi);
            if(mn[i].front().c==j-k2)
                mn[i].pop_front();
            if(mx[i].front().c==j-k2)
                mx[i].pop_front();
            if(j>=k2)
            {
                if(mx[i].front().v-mn[i].front().v<req1)
                    req1=mx[i].front().v-mn[i].front().v,nr1=1;
                else if(mx[i].front().v-mn[i].front().v==req1)
                    nr1++;
            }
        }
        mn[i].clear();
        mx[i].clear();
    }
    if(k1!=k2)
    {
        i=k1;
        k1=k2;
        k2=i;
        int req2=2000000000,nr2;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=m; j++)
            {
                x.v=a[i][j];
                x.c=j;
                while(!mn[i].empty()&&mn[i].back().v>=x.v)
                    mn[i].pop_back();
                mn[i].push_back(x);
                while(!mx[i].empty()&&mx[i].back().v<=x.v)
                    mx[i].pop_back();
                mx[i].push_back(x);
                if(mn[i].front().c==j-k1)
                    mn[i].pop_front();
                if(mx[i].front().c==j-k1)
                    mx[i].pop_front();
                if(j>=k1)
                {
                    mic[i][j-k1+1]=mn[i].front().v;
                    mare[i][j-k1+1]=mx[i].front().v;
                }
            }
            mn[i].clear();
            mx[i].clear();
        }
        m2=m-k1+1;
        for(i=1; i<=m2; i++)
        {
            for(j=1; j<=n; j++)
            {
                mini.v=mic[j][i];
                maxi.v=mare[j][i];
                mini.c=j;
                maxi.c=j;
                while(!mn[i].empty()&&mn[i].back().v>=mini.v)
                    mn[i].pop_back();
                mn[i].push_back(mini);
                while(!mx[i].empty()&&mx[i].back().v<=maxi.v)
                    mx[i].pop_back();
                mx[i].push_back(maxi);
                if(mn[i].front().c==j-k2)
                    mn[i].pop_front();
                if(mx[i].front().c==j-k2)
                    mx[i].pop_front();
                if(j>=k2)
                {
                    if(mx[i].front().v-mn[i].front().v<req2)
                        req2=mx[i].front().v-mn[i].front().v,nr2=1;
                    else if(mx[i].front().v-mn[i].front().v==req2)
                        nr2++;
                }
            }
            mn[i].clear();
            mx[i].clear();
        }
        if(req2==req1)
            printf("%d %d\n",req1,nr1+nr2);
        if(req1>req2)
            printf("%d %d\n",req2,nr2);
        if(req2>req1)
            printf("%d %d\n",req1,nr1);
    }
    else printf("%d %d\n",req1,nr1);
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    int p,i,j,k1,k2;
    scanf("%d%d%d",&n,&m,&p);
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            scanf("%d",&a[i][j]);
    for(i=1; i<=p; i++)
    {
        scanf("%d%d",&k1,&k2);
        solve(k1,k2);
    }
    return 0;
}