Cod sursa(job #1173402)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 19 aprilie 2014 16:31:36
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include<cstdio>
#include<deque>
using namespace std;
const int N=1000,INF=8000;
int a[N+1][N+1],mins[N+1][N+1],maxs[N+1][N+1],mint[N+1][N+1],maxt[N+1][N+1];
deque<int>d;
int lines,cols,n,m,t,minimum,nra;
void scan(){
    int i,j;
    scanf("%d%d%d",&n,&m,&t);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
}
void init(){
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scan();
}
void setMins(){
    int i,j;
    for(i=1;i<=n;i++){
        d.clear();
        for(j=1;j<=m;j++){
            while(!d.empty()&&a[i][j]<=a[i][d.back()])
                d.pop_back();
            d.push_back(j);
            if(j-d.front()==cols)
                d.pop_front();
            if(j>=cols)
                mins[i][j]=a[i][d.front()];
        }
    }
}
void setMaxs(){
    int i,j;
    for(i=1;i<=n;i++){
        d.clear();
        for(j=1;j<=m;j++){
            while(!d.empty()&&a[i][j]>=a[i][d.back()])
                d.pop_back();
            d.push_back(j);
            if(j-d.front()==cols)
                d.pop_front();
            if(j>=cols)
                maxs[i][j]=a[i][d.front()];
        }
    }
}
void setMint(){
    int i,j;
    for(j=cols;j<=m;j++){
        d.clear();
        for(i=1;i<=n;i++){
            while(!d.empty()&&mins[i][j]<=mins[d.back()][j])
                d.pop_back();
            d.push_back(i);
            if(i-d.front()==lines)
                d.pop_front();
            if(i>=lines)
                mint[i][j]=mins[d.front()][j];
        }
    }
}
void setMaxt(){
    int i,j;
    for(j=cols;j<=m;j++){
        d.clear();
        for(i=1;i<=n;i++){
            while(!d.empty()&&maxs[i][j]>=maxs[d.back()][j])
                d.pop_back();
            d.push_back(i);
            if(i-d.front()==lines)
                d.pop_front();
            if(i>=lines)
                maxt[i][j]=maxs[d.front()][j];
        }
    }
}
void solve(){
    int i,j;
    setMins();
    setMint();
    setMaxs();
    setMaxt();
    for(i=lines;i<=n;i++)
        for(j=cols;j<=m;j++){
            if(maxt[i][j]-mint[i][j]==minimum)
                nra++;
            if(maxt[i][j]-mint[i][j]<minimum){
                nra=1;
                minimum=maxt[i][j]-mint[i][j];
            }
        }
}
void swap(){
    int aux=lines;
    lines=cols;
    cols=aux;
}
void initQuerry(){
    minimum=INF+1;
    nra=0;
    t--;
    scanf("%d%d",&lines,&cols);
}
int main(){
    init();
    while(t>0){
        initQuerry();
        solve();
        swap();
        if(lines!=cols)
            solve();
        printf("%d %d\n",minimum,nra);
    }
    return 0;
}