Cod sursa(job #3366885)

Utilizator amavutsiviatam-aulachitgaboriipetrusifilip amavutsiviata Data 5 octombrie 2026 09:56:11
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <fstream>
#include <deque>
using namespace std;

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

int v[1001][1001];
int min1[1001][1001];
int max1[1001][1001];
deque<pair<int,int>> colmax[1001];
deque<pair<int,int>> colmin[1001];
deque<pair<int,int>> qmin,qmax;

int n,m;

pair<int,int> query(int l,int c){
    int i,j,maxq1=1e9,cnt=0;
    for(j=1;j<=m;j++){
        colmax[j].clear();
        colmin[j].clear();
        for(i=1;i<=n;i++){
            while(!colmax[j].empty() && colmax[j].front().second<i-l+1)
                colmax[j].pop_front();
            while(!colmax[j].empty() && colmax[j].back().first<=v[i][j])
                colmax[j].pop_back();
            colmax[j].push_back({v[i][j],i});

            while(!colmin[j].empty() && colmin[j].front().second<i-l+1)
                colmin[j].pop_front();
            while(!colmin[j].empty() && colmin[j].back().first>=v[i][j])
                colmin[j].pop_back();
            colmin[j].push_back({v[i][j],i});

            min1[i][j]=colmin[j].front().first;
            max1[i][j]=colmax[j].front().first;
        }
    }
    for(i=1;i<=n-l+1;i++){
        qmin.clear();
        qmax.clear();
        for(j=1;j<=m;j++){
            while(!qmin.empty() && qmin.front().second<j-c+1)
                qmin.pop_front();
            while(!qmin.empty() && qmin.back().first>=min1[i+l-1][j])
                qmin.pop_back();
            qmin.push_back({min1[i+l-1][j],j});
            while(!qmax.empty() && qmax.front().second<j-c+1)
                qmax.pop_front();
            while(!qmax.empty() && qmax.back().first<=max1[i+l-1][j])
                qmax.pop_back();
            qmax.push_back({max1[i+l-1][j],j});
            if(j>=c){
                if(qmax.front().first-qmin.front().first<maxq1){
                    maxq1=qmax.front().first-qmin.front().first;
                    cnt=1;
                }else if(qmax.front().first-qmin.front().first==maxq1)
                    cnt++;
            }
        }
    }
    return {maxq1,cnt};
}

int main()
{
    int l,c,p,i,j;
    cin>>n>>m>>p;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            cin>>v[i][j];
        }
    }
    for(i=1;i<=p;i++){
        cin>>l>>c;
        if(l!=c){
            auto it1=query(l,c);
            auto it2=query(c,l);

            if(it1.first==it2.first){
                cout<<it1.first<<" "<<it1.second+it2.second<<"\n";
            }else if(it1.first<it2.first){
                cout<<it1.first<<" "<<it1.second<<"\n";
            }else{
                cout<<it2.first<<" "<<it2.second<<"\n";
            }
        }else{
            auto it=query(l,c);
            cout<<it.first<<" "<<it.second<<"\n";
        }
    }
    return 0;
}