Pagini recente » Istoria paginii runda/simulare_oji_241/clasament | Istoria paginii runda/try_it/clasament | Cod sursa (job #2891623) | Cod sursa (job #2438832) | Cod sursa (job #1244803)
#include <cstdio>
#include <deque>
#define NMAX 1007
using namespace std;
deque < int > DeqMin, DeqMax;
int DpMin[NMAX][NMAX], DpMax[NMAX][NMAX], a[NMAX][NMAX];
int n, m, Ans, Nr;
void solve(int x, int y){
for(int i = 1; i <= n; ++i, DeqMin.clear(), DeqMax.clear())
for(int j = 1; j <= m; ++ j){
while(! DeqMin.empty() && a[i][DeqMin.back()] >= a[i][j])
DeqMin.pop_back();
DeqMin.push_back(j);
if(DeqMin.front() == j - y)
DeqMin.pop_front();
if(j >= y && !DeqMin.empty())
DpMin[i][j] = a[i][DeqMin.front()];
while(! DeqMax.empty() && a[i][DeqMax.back()] <= a[i][j])
DeqMax.pop_back();
DeqMax.push_back(j);
if(DeqMax.front() == j - y)
DeqMax.pop_front();
if(j >= y && !DeqMax.empty())
DpMax[i][j] = a[i][DeqMax.front()];
}
/**for(int i = 1; i <= n; ++i, printf("\n"))
for(int j = 1; j <= m; ++j)
printf("%d ", DpMin[i][j]);
printf("\n");
for(int i = 1; i <= n; ++i, printf("\n"))
for(int j = 1; j <= m; ++j)
printf("%d ", DpMax[i][j]);**/
for(int i = y; i <= m; ++i, DeqMin.clear(), DeqMax.clear())
for(int j = 1; j <= n; ++ j){
while(! DeqMin.empty() && DpMin[DeqMin.back()][i] >= DpMin[j][i])
DeqMin.pop_back();
while(!DeqMin.empty() && DeqMin.front() <= j - x)
DeqMin.pop_front();
DeqMin.push_back(j);
while(! DeqMax.empty() && DpMax[DeqMax.back()][i] <= DpMax[j][i])
DeqMax.pop_back();
while(!DeqMax.empty() && DeqMax.front() <= j - x)
DeqMax.pop_front();
DeqMax.push_back(j);
if(j >= x){
int Aux = DpMax[DeqMax.front()][i] - DpMin[DeqMin.front()][i];
///printf("%d\n", Aux);
if(Aux == Ans)
++Nr;
if(Aux < Ans){
Ans = Aux;
Nr = 1;
}
}
}
}
int main(){
int T;
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
scanf("%d %d %d", &n, &m, &T);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
while(T){
--T;
int x, y;
scanf("%d %d", &x, &y);
Ans = 100000000;
Nr = 0;
solve(x, y);
if(x != y)
solve(y, x);
printf("%d %d\n", Ans, Nr);
}
return 0;
}