Pagini recente » Cod sursa (job #2322996) | Cod sursa (job #71521) | Cod sursa (job #1425889) | Cod sursa (job #2796448) | Cod sursa (job #3306023)
#include <bits/stdc++.h>
using namespace std;
int n,m,teste, v[1005][1005], minn=INT_MAX, cntMin=0;
int matMax[1005][1005], matMin[1005][1005];
void rezolv(int dx, int dy)
{
for(int i=1; i<=n; i++)
{
deque<int> cresc, desc;
for(int j=1; j<dx; j++)
{
while(!desc.empty() && v[i][j]<v[i][desc.back()])
desc.pop_back();
desc.push_back(j);
while(!cresc.empty() && v[i][j]>v[i][cresc.back()])
cresc.pop_back();
cresc.push_back(j);
}
for(int j=dx; j<=m; j++)
{
while(!desc.empty() && v[i][j]<v[i][desc.back()])
desc.pop_back();
desc.push_back(j);
while(!desc.empty() && j-desc.front()>=dx)
desc.pop_front();
matMin[i][j-dx+1]=v[i][desc.front()];
while(!cresc.empty() && v[i][j]>v[i][cresc.back()])
cresc.pop_back();
cresc.push_back(j);
while(!cresc.empty() && j-cresc.front()>=dx)
cresc.pop_front();
matMax[i][j-dx+1]=v[i][cresc.front()];
}
}
for(int j=1; j<=m-dx+1; j++)
{
deque<int> cresc, desc;
for(int i=1; i<dy; i++)
{
while(!desc.empty() && matMin[i][j]<matMin[desc.back()][j])
desc.pop_back();
desc.push_back(i);
while(!cresc.empty() && matMax[i][j]>matMax[cresc.back()][j])
cresc.pop_back();
cresc.push_back(i);
}
for(int i=dy; i<=n; i++)
{
while(!desc.empty() && matMin[i][j]<matMin[desc.back()][j])
desc.pop_back();
desc.push_back(i);
while(!desc.empty() && i-desc.front()>=dy)
desc.pop_front();
while(!cresc.empty() && matMax[i][j]>matMax[cresc.back()][j])
cresc.pop_back();
cresc.push_back(i);
while(!cresc.empty() && i-cresc.front()>=dy)
cresc.pop_front();
int x=matMax[cresc.front()][j]; ///x este maximul din tabelul de latime dx, inaltime dy ce incepe in i,j
int y=matMin[desc.front()][j];
if(x-y<minn)
minn=x-y, cntMin=1;
else if(x-y==minn)
cntMin++;
}
}
}
int main()
{
ifstream cin("struti.in");
ofstream cout("struti.out");
cin>>n>>m>>teste;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>v[i][j];
while(teste--)
{
minn=INT_MAX;
cntMin=0;
int l1, l2;
cin>>l1>>l2;
rezolv(l1,l2);
if(l1!=l2)
rezolv(l2,l1);
cout<<minn<<" "<<cntMin<<'\n';
}
return 0;
}