Pagini recente » Cod sursa (job #1329042) | Cod sursa (job #362767) | Cod sursa (job #2567786) | Cod sursa (job #135523) | Cod sursa (job #3315826)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int Nmax = 1005;
int n, m;
int a[Nmax][Nmax];
int mini_lin[Nmax][Nmax], maxi_lin[Nmax][Nmax];
pair<int, int> query(int lin, int col)
{
for(int i = 1; i <= n; ++i)
{
deque<int> dqMax, dqMin;
for(int j = 1; j <= m; ++j)
{
// Min
while(!dqMin.empty() && a[i][dqMin.back()] >= a[i][j])
dqMin.pop_back();
dqMin.push_back(j);
while(!dqMin.empty() && dqMin.front() <= j - col)
dqMin.pop_front();
mini_lin[i][j] = a[i][dqMin.front()];
// Max
while(!dqMax.empty() && a[i][dqMax.back()] <= a[i][j])
dqMax.pop_back();
dqMax.push_back(j);
while(!dqMax.empty() && dqMax.front() <= j - col)
dqMax.pop_front();
maxi_lin[i][j] = a[i][dqMax.front()];
}
}
int difmin = INT_MAX, cnt = 0;
for(int j = col; j <= m; ++j)
{
deque<int> dqMin, dqMax;
for(int i = 1; i <= n; ++i)
{
// Min
while(!dqMin.empty() && mini_lin[dqMin.back()][j] >= mini_lin[i][j])
dqMin.pop_back();
dqMin.push_back(i);
while(!dqMin.empty() && dqMin.front() <= i - lin)
dqMin.pop_front();
// Max
while(!dqMax.empty() && maxi_lin[dqMax.back()][j] <= maxi_lin[i][j])
dqMax.pop_back();
dqMax.push_back(i);
while(!dqMax.empty() && dqMax.front() <= i - lin)
dqMax.pop_front();
if(i >= lin)
{
int curMin = mini_lin[dqMin.front()][j];
int curMax = maxi_lin[dqMax.front()][j];
int dif = curMax - curMin;
if(dif < difmin){
difmin = dif;
cnt = 1;
}
else if(dif == difmin)
cnt++;
}
}
}
return {difmin, cnt};
}
int main()
{
int p;
fin >> n >> m >> p;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
fin >> a[i][j];
while(p--)
{
int dx, dy;
fin >> dx >> dy;
auto rasps1 = query(dx, dy);
if(dx == dy){
fout << rasps1.first << " " << rasps1.second << '\n';
}
else{
auto rasps2 = query(dy, dx);
if(rasps1.first < rasps2.first)
fout << rasps1.first << " " << rasps1.second << '\n';
else if(rasps2.first < rasps1.first)
fout << rasps2.first << " " << rasps2.second << '\n';
else
fout << rasps1.first << " " << (rasps1.second + rasps2.second) << '\n';
}
}
return 0;
}