Cod sursa(job #3307862)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 23 august 2025 10:11:20
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;

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

int v[1005][1005];
int xmin[1005][1005];
int xmax[1005][1005];
int n,m,p;

pair<int,int> solve(int dx, int dy){
    int ans = (1<<30);
    int cnt = 0;
    for(int i=1;i<=n;i++){
        deque<int> dmin;
        deque<int> dmax;
        for(int j=1;j<=m;j++){
            while(!dmin.empty() and v[i][j]<=v[i][dmin.back()]){
                dmin.pop_back();
            }
            while(!dmax.empty() and v[i][j]>=v[i][dmax.back()]){
                dmax.pop_back();
            }
            dmin.push_back(j);
            dmax.push_back(j);
            if(dmin.front()==j-dy){
                dmin.pop_front();
            }
            if(dmax.front()==j-dy){
                dmax.pop_front();
            }
            if(j>=dy){
                xmin[i][j] = v[i][dmin.front()];
                xmax[i][j] = v[i][dmax.front()];
            }
        }
    }
    for(int j=dy;j<=m;j++){
        deque<int> dmin;
        deque<int> dmax;
        for(int i=1;i<=n;i++){
            while(!dmin.empty() and xmin[i][j]<=xmin[dmin.back()][j]){
                dmin.pop_back();
            }
            while(!dmax.empty() and xmax[i][j]>=xmax[dmax.back()][j]){
                dmax.pop_back();
            }
            dmin.push_back(i);
            dmax.push_back(i);
            if(dmin.front()==i-dx){
                dmin.pop_front();
            }
            if(dmax.front()==i-dx){
                dmax.pop_front();
            }
            if(i>=dx){
                if(xmax[dmax.front()][j]-xmin[dmin.front()][j]<ans){
                    ans = xmax[dmax.front()][j]-xmin[dmin.front()][j];
                    cnt = 1;
                }else if(xmax[dmax.front()][j]-xmin[dmin.front()][j]==ans){
                    cnt++;
                }
            }
        }
    }
    return {ans,cnt};
}

signed main()
{
    fin >> n >> m >> p;
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            fin >> v[i][j];
        }
    }
    int x,y;
    while(p--){
        fin >> x >> y;
        if(x==y){
            pair <int,int> ans = solve(x,y);
            fout << ans.first << ' ' << ans.second << '\n';
        }else{
            pair<int,int> ans1 = solve(x,y);
            pair<int,int> ans2 = solve(y,x);
            if(ans1.first<ans2.first){
                fout << ans1.first << ' ' << ans1.second << '\n';
            }else if(ans1.first>ans2.first){
                fout << ans2.first << ' ' << ans2.second << '\n';
            }else{
                fout << ans1.first << ' ' << ans1.second+ans2.second << '\n';
            }
        }
    }
    return 0;
}