Pagini recente » Cod sursa (job #2154207) | Cod sursa (job #2964993) | Cod sursa (job #817232) | Cod sursa (job #2379639) | Cod sursa (job #2573432)
#include <bits/stdc++.h>
#define Dim 1001
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int N,M,P,A[Dim][Dim],maxim,minim;
struct info
{
int mini,maxi;
}rmq[12][12][Dim][Dim];
int Solve(int i,int j,int x,int y)
{
int difi=log2(x),difj=log2(y);
maxim=max (max(rmq[difi][difj][i][j].maxi,rmq[difi][difj][i][j-y+(1<<difj)].maxi),
max(rmq[difi][difj][i-x+(1<<difi)][j].maxi,
rmq[difi][difj][i-x+(1<<difi)][j-y+(1<<difj)].maxi));
minim=min(min(rmq[difi][difj][i][j].mini,rmq[difi][difj][i][j-y+(1<<difj)].mini),
min(rmq[difi][difj][i-x+(1<<difi)][j].mini,
rmq[difi][difj][i-x+(1<<difi)][j-y+(1<<difj)].mini));
//cout<<difi<<' '<<difj<<' '<<x<<' '<<y<<' '<<i<<' '<<j<<' '<<maxim<<' '<<minim<<'\n';
}
int main()
{
int x,y;
f>>N>>M>>P;
int dimN=log2(N),dimM=log2(M);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
f>>A[i][j];
rmq[0][0][i][j]={A[i][j],A[i][j]};
}
for(int i=1;i<=N;i++)
for(int j=2;j<=M;j++)
rmq[0][1][i][j]={min(A[i][j-1],A[i][j]),max(A[i][j-1],A[i][j])};
for(int i=N;i>1;i--)
for(int j=1;j<=M;j++)
rmq[1][0][i][j]={min(A[i][j],A[i-1][j]),max(A[i][j],A[i-1][j])};
for(int li=1;li<=dimN;li++)
for(int lj=1;lj<=dimM;lj++)
for(int i=N;i - ( 1<<li ) +1 > 0;i--)
for(int j=M;j - ( 1<<lj ) + 1 >0 ;j--)
{
rmq[li][lj][i][j].mini=min(
min(rmq[li-1][lj-1][i][j].mini,rmq[li-1][lj-1][i][j-(1<<(lj-1))].mini),
min(rmq[li-1][lj-1][i-(1<<(li-1))][j].mini,
rmq[li-1][lj-1][i-(1<<(li-1))][j-(1<<(lj-1))].mini));
rmq[li][lj][i][j].maxi=max(
max(rmq[li-1][lj-1][i][j].maxi,rmq[li-1][lj-1][i][j-(1<<(lj-1))].maxi),
max(rmq[li-1][lj-1][i-(1<<(li-1))][j].maxi,
rmq[li-1][lj-1][i-(1<<(li-1))][j-(1<<(lj-1))].maxi));
// cout<<li<<' '<<lj<<' '<<i<<' '<<j<<' '<<rmq[li][lj][i][j].mini<<' '<<rmq[li][lj][i][j].maxi<<'\n';
}
for(int i=1;i<=P;i++)
{
f>>x>>y;
int ans=9000,cnt=0;
for(int i=x;i<=N;i++)
for(int j=y;j<=N;j++)
{
Solve(i,j,x,y);
if(maxim-minim < ans)
{
ans=maxim-minim;
cnt=1;
}
else
if(maxim-minim==ans) cnt++;
}
if(x!=y)
{
for(int i=y;i<=N;i++)
for(int j=x;j<=N;j++)
{
Solve(i,j,x,y);
if(maxim-minim < ans)
{
ans=maxim-minim;
cnt=1;
}
else
if(maxim-minim==ans) cnt++;
}
}
g<<ans<<' '<<cnt<<'\n';
}
return 0;
}