Cod sursa(job #1936891)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 23 martie 2017 15:42:15
Problema Struti Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
int a,b,m,n,p,v[1002][1002],ma[1002][1002],minx=0xff,nr=0,mb[1002][1002],mc[1002][1002];
deque <int> D;

int deq(int w){
    memset(ma,0,sizeof(ma));
    for (int i=1;i<=m;++i){
        while(!D.empty())D.pop_front();
        for(int j=1;j<=n;++j){
            if(w)
                while(!D.empty() && D.back()>v[i][j])
                    D.pop_back();
            else
                while(!D.empty() && D.back()<v[i][j])
                    D.pop_back();
            D.push_back(v[i][j]);
            if(j>b && D.front()==v[i][j-b])
                D.pop_front();
            if(j>=b)
                ma[i][j]=D.front();
        }
    }
    return 1;
}

int deq1(int w, int vx[][1002]){
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
            vx[i][j]=-1;
    for (int i=1;i<=n;++i){
        while(!D.empty())D.pop_front();

        for(int j=1;j<=m;++j){
            if(w)
                while(!D.empty() && D.back()>ma[j][i])
                    D.pop_back();
            else
                while(!D.empty() && D.back()<ma[j][i])
                    D.pop_back();
            D.push_back(ma[j][i]);
            if(j>a && D.front()==ma[j-a][i])
                D.pop_front();
            if(j>=a && i>=b)
                vx[j][i]=D.front();
        }
    }
    return 1;
}

int main()
{
    fin>>m>>n>>p;
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
            fin>>v[i][j];
    while(p--){
        minx=0xff;
        nr=0;
        fin>>a>>b;
        deq(1);
        deq1(1,mb);
        deq(0);
        deq1(0,mc);
        for(int i=1;i<=m;++i)
            for(int j=1;j<=n;++j)
                if(mb[i][j]!=-1 && mc[i][j]!=-1)
                    if(mc[i][j]-mb[i][j]<minx){minx=mc[i][j]-mb[i][j];nr=1;}else if(mc[i][j]-mb[i][j]==minx){nr++;}
        if(a!=b){
            a^=b^=a^=b;
            deq(1);
            deq1(1,mb);
            deq(0);
            deq1(0,mc);
            for(int i=1;i<=m;++i)
                for(int j=1;j<=n;++j)
                    if(mb[i][j]!=-1 && mc[i][j]!=-1)
                        if(mc[i][j]-mb[i][j]<minx){minx=mc[i][j]-mb[i][j];nr=1;}else if(mc[i][j]-mb[i][j]==minx){nr++;}
        }
        fout<<minx<<' '<<nr<<'\n';
    }
    return 0;
}