Pagini recente » Cod sursa (job #317075) | Cod sursa (job #3203133) | Cod sursa (job #2927221) | Cod sursa (job #2251241) | Cod sursa (job #2637332)
#include <bits/stdc++.h>
using namespace std;
ifstream r("struti.in");
ofstream w("struti.out");
int rez, n, m, dx, dy, q, na, nb, a, b, l1, l2, k1, k2, nr, z;
int v[1005][1005],mx[1005][1005],mn[1005][1005];
struct per
{
int h,p;
} l[1005],k[1005];
int do_dx_dy(int dx,int dy)
{
nr=0;
short rz=10000;
for(int j=1; j<=m; j++)
{
l1=k1=1;
l2=k2=0;
for(int i=1; i<=n; i++)
{
z=v[i][j];
if(l[l1].p==i-dx){
l1++;
}
while(l2>=l1 && l[l2].h<=z){
l2--;
}
l[++l2]= {z,i};
mx[i][j]=l[l1].h;
if(k[k1].p==i-dx){
k1++;
}
while(k2>=k1 && k[k2].h>=z){
k2--;
}
k[++k2]= {z,i};
mn[i][j]=k[k1].h;
}
}
for(int i=dx; i<=n; i++)
{
l1=k1=1;
l2=k2=0;
for(int j=1; j<=m; j++)
{
z=mx[i][j];
if(l[l1].p==j-dy){
l1++;
}
while(l2>=l1 && l[l2].h<=z){
l2--;
}
l[++l2]= {z,j};
z=mn[i][j];
if(k[k1].p==j-dy){
k1++;
}
while(k2>=k1 && k[k2].h>=z){
k2--;
}
k[++k2]= {z,j};
if(j>=dy)
{
z=l[l1].h-k[k1].h;
if(z<rz){
rz=z;
nr=0;
}
if(z==rz){
nr++;
}
}
}
}
return rz;
}
int main()
{
r>>n>>m>>q;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
r>>v[i][j];
}
}
while(q--)
{
r>>dx>>dy;
if(dx==dy)
{
a=do_dx_dy(dx,dy);
na=nr;
w<<a<<" "<<na<<"\n";
}
else
{
a=do_dx_dy(dx,dy);
na=nr;
b=do_dx_dy(dy,dx);
nb=nr;
if(a<b){
w<<a<<" "<<na<<"\n";
}
if(a>b){
w<<b<<" "<<nb<<"\n";
}
if(a==b){
w<<a<<" "<<na+nb<<"\n";
}
}
}
}