Cod sursa(job #3315840)

Utilizator horatiu.avramAvram Popa Cristian Horatiu horatiu.avram Data 16 octombrie 2025 10:58:31
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cover.in");
ofstream fout("cover.out");
int n,m;
const int MAXN=1e3;
int a[MAXN+1][MAXN+1],vmin[MAXN+1][MAXN+1],vmax[MAXN+1][MAXN+1];
void solve_col(int col,int dx) {
    deque<int>dqmin,dqmax;
    for(int i=0; i<n; i++) {
        while(!dqmin.empty()&&dqmin.front()==i-dx) {
            dqmin.pop_front();
        }
        while(!dqmax.empty()&&dqmax.front()==i-dx) {
            dqmax.pop_front();
        }
        while(!dqmin.empty()&&a[dqmin.back()][col]>=a[i][col]) {
            dqmin.pop_back();
        }
        dqmin.push_back(i);
        while(!dqmax.empty()&&a[dqmax.back()][col]<=a[i][col]) {
            dqmax.pop_back();
        }
        dqmax.push_back(i);
        if(i>=dx-1) {
            vmax[i][col]=a[dqmax.front()][col];
            vmin[i][col]=a[dqmin.front()][col];
        }
    }
}
void build(int dx) {
    for(int i=0; i<m; i++) {
        solve_col(i,dx);
    }
}
pair<int,int> solve(int dl,int dc) {
    int diffmin=2e9,nr=0;
    for(int i=dl-1; i<n; i++) {
        deque<int>dqmin,dqmax;
        while(!dqmin.empty()) {
            dqmin.pop_back();
        }
        while(!dqmax.empty()) {
            dqmax.pop_back();
        }
        for(int j=0; j<m; j++) {
            while(!dqmin.empty()&&dqmin.front()==j-dc) {
                dqmin.pop_front();
            }
            while(!dqmax.empty()&&dqmax.front()==j-dc) {
                dqmax.pop_front();
            }
            while(!dqmin.empty()&&vmin[i][dqmin.back()]>=vmin[i][j]) {
                dqmin.pop_back();
            }
            dqmin.push_back(j);
            while(!dqmax.empty()&&vmax[i][dqmax.back()]<=vmax[i][j]) {
                dqmax.pop_back();
            }
            dqmax.push_back(j);
            if(j>=dc-1) {
                int diff=vmax[i][dqmax.front()]-vmin[i][dqmin.front()];
                if(diff<diffmin) {
                    diffmin=diff;
                    nr=1;
                } else if(diff==diffmin) {
                    nr++;
                }
            }
        }
    }
    return  make_pair(diffmin,nr);
}
int main() {
    int q;
    fin>>n>>m>>q;
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            fin>>a[i][j];
        }
    }
    while(q--) {
        int dl,dc;
        fin>>dl>>dc;
        build(dl);
        pair<int,int>ans=solve(dl,dc);
        if(dl!=dc) {
            build(dc);
            pair<int,int>ans2=solve(dc,dl);
            if(ans.first>ans2.first) {
                ans.first=ans2.first;
                ans.second=ans2.second;
            } else if(ans.first==ans2.first) {
                ans.second+=ans2.second;
            }
        }
        fout<<ans.first<<' '<<ans.second<<'\n';
    }
    return 0;
}