Cod sursa(job #2761329)

Utilizator GligarEsterabadeyan Hadi Gligar Data 1 iulie 2021 18:02:04
Problema Struti Scor 80
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 3.15 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<=n;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);
            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();
            }
            if(i>=a){
                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(j>=b){
                    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<<dq_min[j].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;
}