Pagini recente » Cod sursa (job #1045399) | Cod sursa (job #279207) | Cod sursa (job #732383) | Cod sursa (job #1833711) | Cod sursa (job #1083692)
#include <iostream>
#include <fstream>
#include <cmath>
#include <string.h>
#define MAX_N 1001
using namespace std;
int n,m,p,a,b,i,j,p1=1,p2=1,u1=1,u2=1,vf=0,Min[MAX_N][MAX_N],Max[MAX_N][MAX_N],minim[MAX_N],maxim[MAX_N],v[MAX_N][MAX_N],rasp,temp,nr;
void solve(int x, int y){
for(i=1;i<=n;i++){
p1=1;p2=1;u1=1;u2=1;vf=0;
minim[1]=1;
maxim[1]=1;
for(j=2;j<=m;j++){
while(v[i][j]<=v[i][minim[u1]] && u1>=p1)
u1--;
while(v[i][j]>=v[i][maxim[u2]] && u2>=p2)
u2--;
u1++;
minim[u1]=j;
u2++;
maxim[u2]=j;
if((j-minim[p1])>=y)
p1++;
if((j-maxim[p2])>=y)
p2++;
if(j>=y){
vf++;
Min[i][vf]=v[i][minim[p1]];
Max[i][vf]=v[i][maxim[p2]];
}
}
}
memset(minim,0,sizeof(minim));
memset(maxim,0,sizeof(maxim));
for(i=1;i<=vf;i++){
p1=1;p2=1;u1=1;u2=1;
minim[1]=1;maxim[1]=1;
for(j=1;j<=n;j++){
while(Min[j][i]<=Min[minim[u1]][i] && u1>=p1)
u1--;
while(Max[j][i]>=Max[maxim[u2]][i] && u2>=p2)
u2--;
u1++;
u2++;
minim[u1]=j;
maxim[u2]=j;
if(j-minim[p1]>=x)
p1++;
if(j-maxim[p2]>=x)
p2++;
if(j>=x){
temp=abs(Min[minim[p1]][i]-Max[maxim[p2]][i]);
if(temp<rasp){
rasp=temp;
nr=1;
}
else if(temp==rasp)
nr++;
}
}
}
}
int main()
{
ifstream f("struti.in");
ofstream g("struti.out");
f>>n>>m>>p;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>v[i][j];
int k;
for(k=0;k<p;k++){
f>>a>>b;
rasp=1000000000;
solve(a,b);
if(a!=b)
solve(a,b);
g<<rasp<<" "<<nr<<'\n';
}
return 0;
}