Pagini recente » Cod sursa (job #1670516) | Cod sursa (job #2822752) | Borderou de evaluare (job #2559721) | Monitorul de evaluare | Cod sursa (job #3315840)
#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;
}