Pagini recente » Borderou de evaluare (job #3366884) | Borderou de evaluare (job #3366885) | Borderou de evaluare (job #3368011) | Cod sursa (job #3367916) | Cod sursa (job #3366906)
#include <fstream>
#include <deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
using ll= long long;
const int dim= 1e3+ 5;
int a[dim][dim], mini[dim][dim], maxi[dim][dim];
int mini1[dim][dim], maxi1[dim][dim];
deque <int> d;
void da_mini(int poz, int n, int k){
int i, j;
for(i= 1;i <= k;i++){
while(!d.empty() and a[poz][d.back()] > a[poz][i])
d.pop_back();
d.push_back(i);
}
mini[poz][k]= a[poz][d.front()];
for(i= k+ 1;i <= n;i++){
while(!d.empty() and d.front() <= i- k)
d.pop_front();
while(!d.empty() and a[poz][d.back()] > a[poz][i])
d.pop_back();
//cout << "help 1.1"<< endl;
d.push_back(i);
mini[poz][i]= a[poz][d.front()];
}
}
void da_maxi(int poz, int n, int k){
int i, j;
for(i= 1;i <= k;i++){
while(!d.empty() and a[poz][d.back()] < a[poz][i])
d.pop_back();
d.push_back(i);
}
maxi[poz][k]= a[poz][d.front()];
for(i= k+ 1;i <= n;i++){
while(!d.empty() and d.front() <= i- k)
d.pop_front();
while(!d.empty() and a[poz][d.back()] < a[poz][i])
d.pop_back();
d.push_back(i);
maxi[poz][i]= a[poz][d.front()];
}
}
void da_mini1(int poz, int n, int k){
int i, j;
for(i= 1;i <= k;i++){
while(!d.empty() and mini[d.back()][poz] > mini[i][poz])
d.pop_back();
d.push_back(i);
}
mini1[k][poz]= mini[d.front()][poz];
for(i= k+ 1;i <= n;i++){
while(!d.empty() and d.front() <= i- k)
d.pop_front();
while(!d.empty() and mini[d.back()][poz] > mini[i][poz])
d.pop_back();
d.push_back(i);
mini1[i][poz]= mini[d.front()][poz];
}
}
void da_maxi1(int poz, int n, int k){
int i, j;
for(i= 1;i <= k;i++){
while(!d.empty() and maxi[d.back()][poz] < maxi[i][poz])
d.pop_back();
d.push_back(i);
}
maxi1[k][poz]= maxi[d.front()][poz];
for(i= k+ 1;i <= n;i++){
while(!d.empty() and d.front() <= i- k)
d.pop_front();
while(!d.empty() and maxi[d.back()][poz] < maxi[i][poz])
d.pop_back();
d.push_back(i);
maxi1[i][poz]= maxi[d.front()][poz];
}
}
void afis(int n, int m){
int i, j;
for(i= 1;i <= n;i++){
for(j= 1;j <= m;j++)
cout << mini[i][j]<<" ";
cout << endl;
}
cout << endl;
for(i= 1;i <= n;i++){
for(j= 1;j <= m;j++)
cout << maxi[i][j]<<" ";
cout << endl;
}
cout << endl;
}
void afis1(int n, int m){
int i, j;
for(i= 1;i <= n;i++){
for(j= 1;j <= m;j++)
cout << mini1[i][j]<<" ";
cout << endl;
}
cout << endl;
for(i= 1;i <= n;i++){
for(j= 1;j <= m;j++)
cout << maxi1[i][j]<<" ";
cout << endl;
}
cout << endl;
}
int main()
{
int n, m, t, i, j, h, w;
cin >> n>> m>> t;
for(i= 1;i <= n;i++)
for(j= 1;j <= m;j++)
cin >> a[i][j];
while(t--){
cin >> h>> w;
int minn= 1e9, cnt= 0;
for(int hk= 1;hk <= 2;hk++){
for(i= 1;i <= n;i++){
da_mini(i, m, w);
while(!d.empty())d.pop_back();
da_maxi(i, m, w);
while(!d.empty())d.pop_back();
}
//afis(n, m);
for(j= 1;j <= m;j++){
da_mini1(j, n, h);
while(!d.empty())d.pop_back();
da_maxi1(j, n, h);
while(!d.empty())d.pop_back();
}
//afis1(n, m);
for(i= h;i <= n;i++)
for(j= w;j <= m;j++){
int nr= maxi1[i][j]- mini1[i][j];
if(minn > nr){
minn= nr;
cnt= 1;
}
else
if(minn== nr)cnt++;
}
swap(h, w);
if(h== w){
break;
}
}
cout << minn<<" "<< cnt<<'\n';
}
return 0;
}