Cod sursa(job #3308567)

Utilizator alexbaldovin20alex baldovin alexbaldovin20 Data 26 august 2025 11:58:23
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include<bits/stdc++.h>

using namespace std;

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

int n,m,p;
vector<vector<int>>v(1005,vector<int>(1005,0));
pair<int,int>solve(int dx,int dy) {
    int ai=INT_MAX;
    int an=0;
    vector<vector<int>>xm(1005,vector<int>(1005,0));
    vector<vector<int>>xM(1005,vector<int>(1005,0));
    for(int i=1;i<=n;i++){
        deque<int>dm;
        deque<int>dM;
        for(int j=1;j<=m;j++){
            while(dm.size()&&v[i][dm.back()]>=v[i][j])
                dm.pop_back();
            dm.push_back(j);
            if(dm.front()==j-dy)
                dm.pop_front();
            while(dM.size()&&v[i][dM.back()]<=v[i][j])
                dM.pop_back();
            dM.push_back(j);
            if(dM.front()==j-dy)
                dM.pop_front();
            if(j>=dy){
                xm[i][j]=v[i][dm.front()];
                xM[i][j]=v[i][dM.front()];
            }
        }
    }
    for(int j=dy;j<=m;j++) {
        deque<int>dm;
        deque<int>dM;
        for(int i=1;i<=n;i++){
            while(dm.size()&&xm[dm.back()][j]>=xm[i][j])
                dm.pop_back();
            dm.push_back(i);
            if(dm.front()==i-dx)
                dm.pop_front();
            while(dM.size()&&xM[dM.back()][j]<=xM[i][j])
                dM.pop_back();
            dM.push_back(i);
            if(dM.front()==i-dx)
                dM.pop_front();
            if(i>=dx){
                if(xM[dM.front()][j]-xm[dm.front()][j]<ai){
                    ai=xM[dM.front()][j]-xm[dm.front()][j];
                    an=1;
                }else if(xM[dM.front()][j]-xm[dm.front()][j]==ai)
                    an++;
            }
        }
    }
    return{ai,an};
}
int main(){
    in>>n>>m>>p;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            in>>v[i][j];
    int x,y;
    while(p--){
        in>>x>>y;
        if(x==y){
            pair<int,int>a1=solve(x,y);
            cout<<a1.first<<" "<<a1.second<<"\n";
        }else{
            pair<int,int>a1=solve(x,y),a2=solve(y,x);
            if(a1.first<a2.first)
                cout<<a1.first<<" "<<a1.second<<"\n";
            else if(a1.first>a2.first)
                cout<<a2.first<<" "<<a2.second<<"\n";
            else
                cout<<a1.first<<" "<<a1.second+a2.second<<"\n";
        }
    }
}