Cod sursa(job #2761320)

Utilizator GligarEsterabadeyan Hadi Gligar Data 1 iulie 2021 17:37:32
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.23 kb
#include <fstream>
#include <queue>
//#include <iostream>

using namespace std;

ifstream fin("struti.in");
ofstream fout("struti.out");

const int nmax=1000, inf=(1<<30)-1;

int v[nmax+1][nmax+1];

deque <int> dq_min[nmax+1], dq_max[nmax+1], dmin, dmax;

int sol=inf,sol2=0;

void solutie(int a,int b, int n, int m){
    for(int i=1;i<=m;i++){
        while(dq_min[i].empty()==0){
            dq_min[i].pop_back();
        }
        while(dq_max[i].empty()==0){
            dq_max[i].pop_back();
        }
    }
    while(dmin.empty()==0){
        dmin.pop_back();
    }
    while(dmax.empty()==0){
        dmax.pop_back();
    }
    for(int i=1;i<=a-1;i++){
        for(int j=1;j<=m;j++){
            while(dq_min[j].empty()==0&&v[dq_min[j].back()][j]>v[i][j]){
                dq_min[j].pop_back();
            }
            dq_min[j].push_back(i);
            while(dq_max[j].empty()==0&&v[dq_max[j].back()][j]<v[i][j]){
                dq_max[j].pop_back();
            }
            dq_max[j].push_back(i);
        }
    }
    for(int i=a;i<=n;i++){
        for(int j=1;j<=b-1;j++){
            while(dq_min[j].empty()==0&&v[dq_min[j].back()][j]>v[i][j]){
                dq_min[j].pop_back();
            }
            dq_min[j].push_back(i);
            if(dq_min[j].front()<=i-a){
                dq_min[j].pop_front();
            }
            while(dq_max[j].empty()==0&&v[dq_max[j].back()][j]<v[i][j]){
                dq_max[j].pop_back();
            }
            dq_max[j].push_back(i);
            if(dq_max[j].front()<=i-a){
                dq_max[j].pop_front();
            }
            while(dmin.empty()==0&&v[dq_min[dmin.back()].front()][dmin.back()]>v[dq_min[j].front()][j]){
                dmin.pop_back();
            }
            dmin.push_back(j);
            while(dmax.empty()==0&&v[dq_max[dmax.back()].front()][dmax.back()]<v[dq_max[j].front()][j]){
                dmax.pop_back();
            }
            dmax.push_back(j);
        }
        for(int j=b;j<=m;j++){
            while(dq_min[j].empty()==0&&v[dq_min[j].back()][j]>v[i][j]){
                dq_min[j].pop_back();
            }
            dq_min[j].push_back(i);
            if(dq_min[j].front()<=i-a){
                dq_min[j].pop_front();
            }
            while(dq_max[j].empty()==0&&v[dq_max[j].back()][j]<v[i][j]){
                dq_max[j].pop_back();
            }
            dq_max[j].push_back(i);
            if(dq_max[j].front()<=i-a){
                dq_max[j].pop_front();
            }
            while(dmin.empty()==0&&v[dq_min[dmin.back()].front()][dmin.back()]>v[dq_min[j].front()][j]){
                dmin.pop_back();
            }
            dmin.push_back(j);
            if(dmin.front()<=j-b){
                dmin.pop_front();
            }
            while(dmax.empty()==0&&v[dq_max[dmax.back()].front()][dmax.back()]<v[dq_max[j].front()][j]){
                dmax.pop_back();
            }
            dmax.push_back(j);
            if(dmax.front()<=j-b){
                dmax.pop_front();
            }
            if(sol>v[dq_max[dmax.front()].front()][dmax.front()]-v[dq_min[dmin.front()].front()][dmin.front()]){
                sol=v[dq_max[dmax.front()].front()][dmax.front()]-v[dq_min[dmin.front()].front()][dmin.front()];
                sol2=1;
            }else if(sol==v[dq_max[dmax.front()].front()][dmax.front()]-v[dq_min[dmin.front()].front()][dmin.front()]){
                sol2++;
            }
            //cout<<"("<<dq_min[dmin.front()].front()<<","<<dmin.front()<<") ";
        }
        //cout<<"\n";
        while(dmin.empty()==0){
            dmin.pop_back();
        }
        while(dmax.empty()==0){
            dmax.pop_back();
        }
    }
}

int main(){
    int m,n,p;
    fin>>n>>m>>p;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            fin>>v[i][j];
        }
    }
    for(int i=1;i<=p;i++){
        int x,y;
        fin>>x>>y;
        sol=inf;
        sol2=0;
        if(x!=y){
            solutie(x,y,n,m);
            solutie(y,x,n,m);
            fout<<sol<<" "<<sol2<<"\n";
        }else{
            solutie(x,y,n,m);
            fout<<sol<<" "<<sol2<<"\n";
        }
    }
    return 0;
}