Cod sursa(job #3307663)

Utilizator Andrei_GAndreiG Andrei_G Data 22 august 2025 16:36:37
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <fstream>
#include <algorithm>
#include <string>
#include <cmath>
#include <queue>
#include <deque>
#include <map>
#include <stack>
#include <vector>
#define int long long
using namespace std;

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

int n, m, p, v[1005][1005], xmin[1005][1005], xmax[1005][1005];
const int INF = 2e9;

pair<int, int> solve(int dx, int dy){
    int rez = INF, nr = 0;
    for (int i = 1; i <= n; i++){
        deque<int> dmin;
        deque<int> dmax;
        for (int j = 1; j <= m; j++){
            while(dmin.empty() == false && v[i][j] <= v[i][dmin.back()]){
                dmin.pop_back();
            }
            dmin.push_back(j);
            while(dmax.empty() == false && v[i][j] >= v[i][dmax.back()]){
                dmax.pop_back();
            }
            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() == false && xmin[i][j] <= xmin[dmin.back()][j]){
                dmin.pop_back();
            }
            dmin.push_back(i);
            while(dmax.empty() == false && xmax[i][j] >= xmax[dmax.back()][j]){
                dmax.pop_back();
            }
            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] < rez){
                    rez = xmax[dmax.front()][j] - xmin[dmin.front()][j];
                    nr = 1;
                }
                else if(xmax[dmax.front()][j] - xmin[dmin.front()][j] == rez){
                    nr++;
                }
            }
        }
    }

    return {rez, nr};
}

signed main(){
    cin>>n>>m>>p;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++){
            cin>>v[i][j];
        }
    }
    int x, y;
    for (int i = 1; i <= p; i++){
        cin>>x>>y;
        if (x == y){
            pair<int, int> ans = solve(x, y);
            cout<<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){
                cout<<ans1.first<<" "<<ans1.second<<"\n";
            }
            else if(ans1.first > ans2.first){
                cout<<ans2.first<<" "<<ans2.second<<"\n";
            }
            else{
                cout<<ans1.first<<" "<<ans1.second + ans2.second<<"\n";
            }
        }
    }
}