Pagini recente » Cod sursa (job #1448666) | Cod sursa (job #2615779) | Cod sursa (job #1692502) | Cod sursa (job #2956047) | Cod sursa (job #2430277)
#include <bits/stdc++.h>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
const int NMAX = 1005;
const int inf = 2e9;
int mat[NMAX][NMAX],n,m,p,ansdif,ansnumber;//,sup[NMAX][NMAX];
deque < int> d,q;
vector <int> vmax[NMAX],vmin[NMAX], supmin[NMAX], supmax[NMAX];
void solve(int x, int y){
int i,j;
for(i = 1 ; i <= n ; i++){
for(j = 1 ; j <= m ; j++){
while(!d.empty() && mat[i][j] <= mat[i][d.back()])
d.pop_back();
d.push_back(j);
if(d.front() == j - y)
d.pop_front();
if(j >= y)
vmin[i].push_back(mat[i][d.front()]);
while(!q.empty() && mat[i][j] >= mat[i][q.back()])
q.pop_back();
q.push_back(j);
if(q.front() == j - y)
q.pop_front();
if(j >= y)
vmax[i].push_back(mat[i][q.front()]);
}
while(!q.empty())
q.pop_back();
while(!d.empty())
d.pop_back();
}
/*for(i = 1 ; i <= n ; i++){
for(j = 0 ; j < vmin[i].size() ; j++)
g << vmin[i][j] << " ";
g << "\n";
}g << "\n";*/
for(j = 0 ; j < vmin[1].size() ; j++){
for(i = 1 ; i <= n ; i++){
while(!d.empty() && vmin[i][j] <= vmin[d.back()][j])
d.pop_back();
d.push_back(i);
if(d.front() == i - x)
d.pop_front();
if(i >= x)
supmin[j].push_back(vmin[d.front()][j]);
}
while(!d.empty())
d.pop_back();
}
for(j = 0 ; j < vmax[1].size() ; j++){
for(i = 1 ; i <= n ; i++){
while(!q.empty() && vmax[i][j] >= vmax[q.back()][j])
q.pop_back();
q.push_back(i);
if(q.front() == i - x)
q.pop_front();
if(i >= x)
supmax[j].push_back(vmax[q.front()][j]);
}
while(!q.empty())
q.pop_back();
}
for(i = 0 ; i < vmin[1].size() ; i++){
for(j = 0 ; j < supmin[i].size() ; j++)
if(supmax[i][j] - supmin[i][j] < ansdif){
ansdif = supmax[i][j] - supmin[i][j];
ansnumber = 1;
}else
if(supmax[i][j] - supmin[i][j] == ansdif){
ansnumber++;
}
}
for(i = 0 ; i < vmin[1].size() ; i++){
while(!supmin[i].empty())
supmin[i].pop_back();
while(!supmax[i].empty())
supmax[i].pop_back();
}
for(i = 1 ; i <= n ; i++){
while(!vmin[i].empty())
vmin[i].pop_back();
while(!vmax[i].empty())
vmax[i].pop_back();
}
}
int main(){
int i,j,x,y,i2,j2;
f >> n >> m >> p;
for(i = 1 ; i <= n ; i++)
for(j = 1 ; j <= m ; j++)
f >> mat[i][j];
for(i = 1 ; i <= p ; i++){
f >> x >> y;
ansdif = inf;
ansnumber = 0;
solve(x,y);
if(x != y)
solve(y,x);
g << ansdif << " " << ansnumber << "\n";
}
return 0;
}