Pagini recente » Cod sursa (job #2484740) | Cod sursa (job #2078885) | Cod sursa (job #3253476) | Cod sursa (job #1852476) | Cod sursa (job #2428069)
#include <bits/stdc++.h>
#define maxim 1003
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
deque < int > deq,deqM;
int n,p,m,DX,DY;
int ans,nr;
int mat[maxim][maxim],mmin[maxim][maxim],mmax[maxim][maxim];
int ansmin[maxim][maxim],ansmax[maxim][maxim]; // nici eu nu stiu ce fac ok
void deqlinii(int a, int b)
{
for (int i=1;i<=n; i++ )
{
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()];
}
deq.clear();
deqM.clear();
}
}
void deqcoloane(int a, int b)
{
for (int j=1;j<=m;j++)
{
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];
}
deq.clear();
deqM.clear();
}
}
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()
{
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';
}
}