Pagini recente » Cod sursa (job #2668537) | Cod sursa (job #2402290) | Cod sursa (job #3135844) | Cod sursa (job #120964) | Cod sursa (job #2910348)
#include <fstream>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
int n,m,q;
int mat[1000][1000];
int matmin[1000][1000];
int matmax[1000][1000];
deque<int>qmin;
deque<int>qmax;
int minn;
int cnt=0;
void Solve(int x,int y)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
matmin[i][j]=0;
matmax[i][j]=0;
}
}
minn=8001;
cnt=0;
for(int j=0;j<m;j++)
{
for(int i=0;i<x;i++)
{
while(!qmin.empty() && mat[i][j]<=mat[qmin.back()][j])
{
qmin.pop_back();
}
qmin.push_back(i);
while(!qmax.empty() && mat[i][j]>=mat[qmax.back()][j])
{
qmax.pop_back();
}
qmax.push_back(i);
}
for(int i=x;i<n;i++)
{
matmin[i-x][j]=mat[qmin.front()][j];
matmax[i-x][j]=mat[qmax.front()][j];
while(!qmin.empty() && qmin.front()<=i-x)
{
qmin.pop_front();
}
while(!qmin.empty() && mat[i][j]<=mat[qmin.back()][j])
{
qmin.pop_back();
}
qmin.push_back(i);
while(!qmax.empty() && qmax.front()<=i-x)
{
qmax.pop_front();
}
while(!qmax.empty() && mat[i][j]>=mat[qmax.back()][j])
{
qmax.pop_back();
}
qmax.push_back(i);
}
matmin[n-x][j]=mat[qmin.front()][j];
matmax[n-x][j]=mat[qmax.front()][j];
qmin.clear();
qmax.clear();
}
for(int i=0;i<n-x+1;i++)
{
for(int j=0;j<y;j++)
{
while(!qmin.empty() && matmin[i][j]<=matmin[i][qmin.back()])
{
qmin.pop_back();
}
qmin.push_back(j);
while(!qmax.empty() && matmax[i][j]>=matmax[i][qmax.back()])
{
qmax.pop_back();
}
qmax.push_back(j);
}
for(int j=y;j<m;j++)
{
//cout<<"*"<<matmin[i][qmin.front()]<<" "<<matmax[i][qmax.front()]<<"*\n";
if(matmax[i][qmax.front()]-matmin[i][qmin.front()]<minn)
{
cnt=1;
minn=matmax[i][qmax.front()]-matmin[i][qmin.front()];
}
else if(matmax[i][qmax.front()]-matmin[i][qmin.front()]==minn)
{
cnt++;
}
while(!qmin.empty() && qmin.front()<=j-y)
{
qmin.pop_front();
}
while(!qmin.empty() && matmin[i][j]<=matmin[i][qmin.back()])
{
qmin.pop_back();
}
qmin.push_back(j);
while(!qmax.empty() && qmax.front()<=j-y)
{
qmax.pop_front();
}
while(!qmax.empty() && matmax[i][j]>=matmax[i][qmax.back()])
{
qmax.pop_back();
}
qmax.push_back(j);
}
//cout<<"*"<<matmin[i][qmin.front()]<<" "<<matmax[i][qmax.front()]<<"*\n";
if(matmax[i][qmax.front()]-matmin[i][qmin.front()]<minn)
{
cnt=1;
minn=matmax[i][qmax.front()]-matmin[i][qmin.front()];
}
else if(matmax[i][qmax.front()]-matmin[i][qmin.front()]==minn)
{
cnt++;
}
qmin.clear();
qmax.clear();
}
}
void printmatmin()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<matmin[i][j]<<" ";
}
cout<<"\n";
}
}
void printmatmax()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<matmax[i][j]<<" ";
}
cout<<"\n";
}
}
int main()
{
cin>>n>>m>>q;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>mat[i][j];
}
}
int x,y;
for(int i=0;i<q;i++)
{
cin>>x>>y;
Solve(x,y);
if(x==y)
{
cout<<minn<<" "<<cnt<<"\n";
continue;
}
int smin1=minn,scnt1=cnt;
Solve(y,x);
int smin2=minn,scnt2=cnt;
if(smin1<smin2)
cout<<smin1<<" "<<scnt1<<"\n";
else if(smin2<smin1)
cout<<smin2<<" "<<scnt2<<"\n";
else if(smin1==smin2)
cout<<smin1<<" "<<scnt1+scnt2<<"\n";
}
return 0;
}