Pagini recente » Cod sursa (job #2794944) | Cod sursa (job #730046) | Cod sursa (job #1123963) | Cod sursa (job #238084) | Cod sursa (job #2428068)
#include <bits/stdc++.h>
#define maxim 1003
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
deque < int > deq,deqM;
int n,m;
int ans,nr;
int mat[maxim][maxim],mmin[maxim][maxim],mmax[maxim][maxim];
int ansmin[maxim][maxim],ansmax[maxim][maxim];
void deqlinii(int a, int b)
{
for (int i=1;i<=n; ++i )
{
if (i!=1)
{
deq.clear();
deqM.clear();
}
for (int j=1;j<=m; ++j)
{
while (!deq.empty() && mat[i][j] < mat[i][deq.back()] )
deq.pop_back();
deq.push_back(j);
if (j-deq.front() >= b)
deq.pop_front();
mmin[i][j]=mat[i][deq.front()];
while (!deqM.empty() && mat[i][j]> mat[i][deqM.back()])
deqM.pop_back();
deqM.push_back(j);
if (j-deqM.front() >= b)
deqM.pop_front();
mmax[i][j]=mat[i][deqM.front()];
}
}
}
void deqcoloane(int a, int b)
{
for (int j=1;j<=m; ++j)
{
if (j!=1)
{
deq.clear();
deqM.clear();
}
for (int i = 1; i <= n; ++i)
{
while (!deq.empty() && mmin[i][j] < mmin[deq.back()][j])
deq.pop_back();
deq.push_back(i);
if (i - deq.front() >= a)
deq.pop_front();
ansmin[i][j] = mmin[deq.front()][j];
while (!deqM.empty () && mmax[i][j] > mmax[deqM.back()][j] )
deqM.pop_back();
deqM.push_back(i);
if (i-deqM.front() >= a)
deqM.pop_front();
ansmax[i][j]=mmax[deqM.front()][j];
}
}
}
void solve(int a , int b)
{
memset(mmin,0,sizeof(mmin));
memset(mmax,0,sizeof(mmax));
deqlinii(a,b);
deqcoloane(a,b);
for (int i=a;i<=n;i++)
for (int j=b;j<=m;j++)
if ( ansmax[i][j]-ansmin[i][j] < ans)
{
ans=ansmax[i][j]-ansmin[i][j];
nr=1;
}
else if (ansmax[i][j]-ansmin[i][j] == ans)
nr++;
}
int main()
{
int p,DX,DY;
f>>n>>m>>p;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
f>>mat[i][j];
while (p--)
{
f>>DX>>DY;
ans=8001;
nr=0;
solve(DX,DY);
if (DX!=DY)
solve(DY,DX);
g<<ans<<" "<<nr<<'\n';
}
}