Pagini recente » Borderou de evaluare (job #2950712) | Borderou de evaluare (job #1338402) | Borderou de evaluare (job #2066482) | Borderou de evaluare (job #1745977) | Cod sursa (job #79563)
Cod sursa(job #79563)
using namespace std;
#include<cstdio>
#include<deque>
#define Nm 1000
#define Inf 8001
int M[Nm][Nm],n,m,p;
deque<int> Minc[Nm],Maxc[Nm],Min,Max;
void read()
{
int i,j;
freopen("struti.in","r",stdin);
scanf("%d%d%d",&n,&m,&p);
for(i=0;i<n;++i)
for(j=0;j<m;++j)
scanf("%d",&M[i][j]);
}
int difmin,nr;
void query(int a, int b)
{
int i,j,dif;
for(j=0;j<m;++j)
{
Minc[j].clear();
Maxc[j].clear();
}
for(i=0;i<n;++i)
{
Min.clear();
Max.clear();
for(j=0;j<m;++j)
{
while(!Minc[j].empty() && M[i][j]<M[Minc[j].back()][j])
Minc[j].pop_back();
Minc[j].push_back(i);
while(!Maxc[j].empty() && M[i][j]>M[Maxc[j].back()][j])
Maxc[j].pop_back();
Maxc[j].push_back(i);
if(i>=a-1)
{
if(Minc[j].front()==i-a)
Minc[j].pop_front();
if(Maxc[j].front()==i-a)
Maxc[j].pop_front();
while(!Min.empty() && M[Minc[j].front()][j]<M[Minc[Min.back()].front()][Min.back()])
Min.pop_back();
Min.push_back(j);
while(!Max.empty() && M[Maxc[j].front()][j]>M[Maxc[Max.back()].front()][Max.back()])
Max.pop_back();
Max.push_back(j);
if(j>=b-1)
{
if(Min.front()==j-b)
Min.pop_front();
if(Max.front()==j-b)
Max.pop_front();
dif=M[Maxc[Max.front()].front()][Max.front()]-M[Minc[Min.front()].front()][Min.front()];
if(dif==difmin)
++nr;
else
if(dif<difmin)
{
difmin=dif;
nr=1;
}
}
}
}
}
}
void solve()
{
int a,b;
freopen("struti.out","w",stdout);
while(p--)
{
scanf("%d%d",&a,&b);
difmin=Inf;
query(a,b);
if(a!=b)
query(b,a);
printf("%d %d\n",difmin,nr);
}
}
int main()
{
read();
solve();
return 0;
}