Cod sursa(job #2308713)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 27 decembrie 2018 17:16:02
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>

using namespace std;

ifstream cin("struti.in");
ofstream cout("struti.out");
const int N=1000;
int n,m,q;
int v[N+5][N+5];
int best=(1<<30),cnt=0;
int deq[N+5],st,dr;
int v1[N+5][N+5];
int mi[N+5][N+5];
void solve(int a,int b)
{
    for(int j=1;j<=m;j++)
    {
        st=1;
        dr=0;
        for(int i=1;i<=n;i++)
        {
            while(st<=dr && v[i][j]<=v[deq[dr]][j])
                dr--;
            if(st<=dr && deq[st]<=i-a)
                st++;
            deq[++dr]=i;
            v1[i][j]=v[deq[st]][j];
        }
    }
    for(int i=a;i<=n;i++)
    {
        st=1;
        dr=0;
        for(int j=1;j<=m;j++) {
            while(st<=dr && v1[i][j]<=v1[i][deq[dr]])
                dr--;
            if(st<=dr && deq[st]<=j-b)
                st++;
            deq[++dr]=j;
            mi[i][j]=v1[i][deq[st]];
        }
    }
    for(int j=1;j<=m;j++) {
        st=1;
        dr=0;
        for(int i=1;i<=n;i++)
        {
            while(st<=dr && v[i][j]>=v[deq[dr]][j])
                dr--;
            if(st<=dr && deq[st]<=i-a)
                st++;
            deq[++dr]=i;
            v1[i][j]=v[deq[st]][j];
        }
    }
    for(int i=a;i<=n;i++)
    {
        st=1;
        dr=0;
        for(int j=1;j<=m;j++)
        {
            while(st<=dr && v1[i][j]>=v1[i][deq[dr]])
                dr--;
            if(st<=dr && deq[st]<=j-b)
                st++;
            deq[++dr]=j;
            int ma=v1[i][deq[st]];
            int dif=ma-mi[i][j];
            if(j>=b) {
                if(dif<best)
                {
                    best=dif;
                    cnt=0;
                }
                if(dif==best)
                    cnt++;
            }
        }
    }
}

int main() {
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>v[i][j];
    while(q--)
    {
        int x,y;
        cin>>x>>y;
        best=(1<<30);
        cnt=0;
        solve(x,y);
        if(x!=y)
            solve(y,x);
        cout<<best<<" "<<cnt<<"\n";
    }
    return 0;
}