Cod sursa(job #1281909)

Utilizator MKLOLDragos Ristache MKLOL Data 3 decembrie 2014 20:28:38
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include<stdio.h>
#include<algorithm>
#include<vector>

#define mp make_pair
#define fs first
#define sc second
using namespace std;
int m[1010][1010];
int ma[1010][1010];
int mi[1010][1010],P,N,M,st,dr;
int dq[10100];
int dq1[10100];
int dq2[10100];

int Nx,Mx;
void dqmi(int x){
    st=dr=0;

    for(int i=1;i<=N;++i){
        while(dr > st && m[dq[dr-1]][x] > m[i][x]){
            --dr;
        }
        dq[dr] = i;
        ++dr;
        if(i-dq[st]+1 > Nx)
            ++st;
        mi[i][x] = m[dq[st]][x];
    }
}
void dqma(int x){
    st=dr=0;

    for(int i=1;i<=N;++i){
        while(dr > st && m[dq[dr-1]][x] < m[i][x]){
            --dr;
        }
        dq[dr] = i;
        ++dr;
        if(i-dq[st]+1 > Nx)
            ++st;
        ma[i][x] = m[dq[st]][x];
    }
}

void print(){
    for(int i=1;i<=N;++i){
        for(int j=1;j<=M;++j){
            printf("%d ",mi[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for(int i=1;i<=N;++i){
        for(int j=1;j<=M;++j){
            printf("%d ",ma[i][j]);
        }
        printf("\n");
    }
}
int mind,nrr;
void make(int L1,int L2){
    Nx = L1;
    Mx = L2;
    for(int i=1;i<=M;++i){
        dqmi(i);
        dqma(i);
    }
    mind = 10101010;
    nrr  = 0;
    int st1=0,dr1=0;
    int st2=0,dr2=0;
    for(int i=Nx;i<=N;++i){
        st1=st2=dr1=dr2=0;
        for(int j=1;j<=M;++j){
            while(dr1 > st1 && ma[i][dq1[dr1-1]] < ma[i][j]){
                --dr1;
            }
            dq1[dr1] = j;
            ++dr1;
            if(j-dq1[st1]+1 > Mx)
                ++st1;

            while(dr2 > st2 && mi[i][dq2[dr2-1]] > mi[i][j]){
                --dr2;
            }
            dq2[dr2] = j;
            ++dr2;
            if(j-dq2[st2]+1 > Mx)
                ++st2;

            if(j>=Mx){
                int mini = mi[i][dq2[st2]];
                int maxi = ma[i][dq1[st1]];
                //printf("%d %d %d %d %d\n",i,j,mini,maxi,maxi-mini);
                if(maxi - mini < mind){
                    mind = maxi-mini;
                    nrr = 1;
                } else if(maxi - mini == mind){
                    ++nrr;
                }
            }
        }
    }
    //print();
}

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",&m[i][j]);
        }
    }
    for(int i=1;i<=P;++i){
        int x,y;
        int sol1=0,sol2=0;
        scanf("%d %d",&x,&y);
        make(x,y);
        sol1=mind;
        sol2=nrr;
        if(x != y){
            make(y,x);
            if(sol1 == mind)
            sol2+=nrr;
            else if(sol1 > mind){
                sol1=mind;
                sol2=nrr;
            }
        }
        printf("%d %d\n",sol1,sol2);

    }
}