Pagini recente » Cod sursa (job #229786) | Cod sursa (job #2679125) | Cod sursa (job #3180123) | Cod sursa (job #2948272) | Cod sursa (job #916009)
Cod sursa(job #916009)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<deque>
#include<ctype.h>
using namespace std;
int n,m,x,y,a[1005][1005];
int ml[1005][1005];
int Ml[1005][1005];
char s[20005];
deque<int> Q,q;
int solve(int x,int y,int &nr)
{
memset(ml,0,sizeof(ml));
memset(Ml,0,sizeof(Ml));
///ml[i][j]=elementul minim de pe linia i, din intervalul j-y+1...j
///Ml[i][j]=elementul maxim de pe linia i, din intervalul j-y+1...j
for(int i=1;i<=n;i++)
{
while(!q.empty()) q.pop_back();
while(!Q.empty()) Q.pop_back();
for(int j=1;j<=m;j++)
{
if(!q.empty() && j-q.front()==y)
q.pop_front();
if(!Q.empty() && j-Q.front()==y)
Q.pop_front();
while(!q.empty() && a[i][j]<=a[i][q.back()])
q.pop_back();
q.push_back(j);
while(!Q.empty() && a[i][j]>=a[i][Q.back()])
Q.pop_back();
Q.push_back(j);
if(j>=y)
ml[i][j]=a[i][q.front()],
Ml[i][j]=a[i][Q.front()];
}
}
nr=0;int ans=8001;
for(int j=y;j<=m;j++)
{
while(!q.empty()) q.pop_back();
while(!Q.empty()) Q.pop_back();
for(int i=1;i<=n;i++)
{
if(!q.empty() && i-q.front()==x)
q.pop_front();
if(!Q.empty() && i-Q.front()==x)
Q.pop_front();
while(!q.empty() && ml[i][j]<=ml[q.back()][j])
q.pop_back();
q.push_back(i);
while(!Q.empty() && Ml[i][j]>=Ml[Q.back()][j])
Q.pop_back();
Q.push_back(i);
if(i>=x)
if(Ml[Q.front()][j]-ml[q.front()][j]<ans)
ans=Ml[Q.front()][j]-ml[q.front()][j],nr=1;
else
if(Ml[Q.front()][j]-ml[q.front()][j]==ans)
nr++;
}
}
return ans;
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int k,i,j,M1,M2,nr1,nr2,next;
scanf("%d%d%d\n",&n,&m,&k);
for(i=1;i<=n;i++)
{
gets(s);next=0;
for(j=1;j<=m;j++)
{
while(isdigit(s[next]))
a[i][j]=a[i][j]*10+s[next++]-'0';
next++;
}
}
for(i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
M1=solve(x,y,nr1);
M2=solve(y,x,nr2);
if(M1<M2)
printf("%d %d\n",M1,nr1);
else
if(M1>M2)
printf("%d %d\n",M2,nr2);
else
if(x!=y)
printf("%d %d\n",M1,nr1+nr2);
else
printf("%d %d\n",M1,nr1);
}
return 0;
}