Cod sursa(job #1261831)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 12 noiembrie 2014 19:02:52
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.5 kb
#include <fstream>

using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int A[1002][1002],n,m,i,j,a,b,k,d[1002],p,u,d1[1002],p1,u1,mini,nr,aux;
int B[1002][1002],c[1002][1002];
int main(){

    fin>>n>>m>>k;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            fin>>A[i][j];
    for(;k>0;k--){
        fin>>a>>b;
        mini=8000;
        nr=0;
        for(i=1;i<=n;i++){
            p1=1;
            p=1;
            u=1;
            u1=1;
            d[1]=1;
            d1[1]=1;
            for(j=2;j<=m;j++){
                while(p<=u && A[i][j]<A[i][d[u]])
                    u--;
                d[++u]=j;
                if(j-d[p]==b)
                    p++;
                if(j>=b)
                    c[i][j]=A[i][d[p]];
                while(p1<=u1 && A[i][j]>A[i][d1[u1]])
                    u1--;
                d1[++u1]=j;
                if(j-d1[p1]==b)
                    p1++;
                if(j>=b)
                    B[i][j]=A[i][d1[p1]];
            }
        }
        for(j=b;j<=m;j++){
            p1=1;
            p=1;
            u=1;
            u1=1;
            d[1]=1;
            d1[1]=1;
            for(i=2;i<=n;i++){
                while(p<=u && c[i][j]<c[d[u]][j])
                    u--;
                d[++u]=i;
                if(i-d[p]==a) p++;
                while(p1<=u1 && B[i][j]>B[d1[u1]][j])
                    u1--;
                d1[++u1]=i;
                if(i-d1[p1]==a) p1++;
                if(i>=a){
                    if(B[d1[p1]][j]-c[d[p]][j]<mini)
                        mini=B[d1[p1]][j]-c[d[p]][j],nr=0;
                    if(B[d1[p1]][j]-c[d[p]][j]==mini)
                        nr++;
                }
            }
        }
        if(a!=b){
            aux=a;
            a=b;
            b=aux;
            for(i=1;i<=n;i++){
                p1=1;
                p=1;
                u=1;
                u1=1;
                d[1]=1;
                d1[1]=1;
                for(j=2;j<=m;j++){
                    while(p<=u && A[i][j]<A[i][d[u]])
                        u--;
                    d[++u]=j;
                    if(j-d[p]==b)
                        p++;
                    if(j>=b)
                        c[i][j]=A[i][d[p]];
                    while(p1<=u1 && A[i][j]>A[i][d1[u1]])
                        u1--;
                    d1[++u1]=j;
                    if(j-d1[p1]==b)
                        p1++;
                    if(j>=b)
                        B[i][j]=A[i][d1[p1]];
                }
            }
            for(j=b;j<=m;j++){
                p1=1;
                p=1;
                u=1;
                u1=1;
                d[1]=1;
                d1[1]=1;
                for(i=2;i<=n;i++){
                    while(p<=u && c[i][j]<c[d[u]][j])
                        u--;
                    d[++u]=i;
                    if(i-d[p]==a) p++;
                    while(p1<=u1 && B[i][j]>B[d1[u1]][j])
                        u1--;
                    d1[++u1]=i;
                    if(i-d1[p1]==a) p1++;
                    if(i>=a){
                        if(B[d1[p1]][j]-c[d[p]][j]<mini)
                            mini=B[d1[p1]][j]-c[d[p]][j],nr=0;
                        if(B[d1[p1]][j]-c[d[p]][j]==mini)
                            nr++;
                    }
                }
            }
        }
        fout<<mini<<" "<<nr<<endl;
    }
    fin.close();fout.close();
    return 0;
}