Pagini recente » Cod sursa (job #2229388) | Cod sursa (job #2792427) | Cod sursa (job #2771532) | Cod sursa (job #2770480) | Cod sursa (job #2650406)
#include <bits/stdc++.h>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
int mat[1001][1001],maxx[1001][1001],minn[1001][1001];
int ansmaxim[1001][1001];
int ansminim[1001][1001];
int deq1[1001],deq2[1001];
int ans,numElements;
int n,m;
void deque_linii(int x,int y)
{
int c1,c2,l1,l2;
for(int i=1;i<=n;i++)
{
c1=1;
c2=1;
l1=0;
c2=0;
for(int j=1;j<=m;j++)
{
while(l1>=c1 && mat[i][j]<mat[i][deq1[l1]])
l1--;
deq1[++l1]=j;
if(j-deq1[c1]>=y) c1++;
minn[i][j]=mat[i][deq1[c1]];
while(l2>=c2 && mat[i][j]>mat[i][deq2[l2]])
l2--;
deq2[++l2]=j;
if(j-deq2[c2]>=y) c2++;
maxx[i][j]=mat[i][deq2[c2]];
}
}
}
void deque_coloane(int x,int y)
{
int c1,c2,l1,l2;
for(int j=y;j<=m;j++)
{
c1=1;
c2=1;
l1=0;
l2=0;
for(int i=1;i<=n;i++)
{
while(l1>=c1 && minn[i][j]<minn[deq1[l1]][j])
l1--;
deq1[++l1]=i;
if(i-deq1[c1]>=x)
c1++;
ansminim[i][j]=minn[deq1[c1]][j];
while(l2>=c2 && maxx[i][j]>maxx[deq2[l2]][j])
l2--;
deq2[++l2]=i;
if(i-deq2[c2]>=x)
c2++;
ansmaxim[i][j]=maxx[deq2[c2]][j];
}
for(int i=x;i<=n;i++)
{
if(ansmaxim[i][j]-ansminim[i][j]<ans)
{
ans=ansmaxim[i][j]-ansminim[i][j];
numElements=1;
}
else if(ansmaxim[i][j]-ansminim[i][j]==ans)
numElements++;
}
}
}
int main()
{
int p;
in>>n>>m>>p;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
in>>mat[i][j];
while(p--)
{
ans=8001;
numElements=0;
int dx,dy;
in>>dx>>dy;
deque_linii(dx,dy);
deque_coloane(dx,dy);
if(dx!=dy)
{
deque_linii(dy,dx);
deque_coloane(dy,dx);
}
out<<ans<<" "<< numElements<<"\n";
}
return 0;
}