Pagini recente » Cod sursa (job #2320140) | Cod sursa (job #2016399) | Arhiva de probleme | Cod sursa (job #1755397) | Cod sursa (job #845764)
Cod sursa(job #845764)
#include<fstream>
#include<string.h>
#define DIM 1010
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int i,j,n,m,u1,p1,u2,p2,Min[DIM][DIM],Max[DIM][DIM],Minim[DIM],Maxim[DIM],V[DIM][DIM],a,b,p,sol,vf,temp,nr;
void read(){
f>>n>>m>>p;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>V[i][j];
}
int mod(int x){
if(x<0)
x*=(-1);
return x;
}
void solve(int x, int y){
for(i=1;i<=n;i++){
p1=1;u1=1;p2=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--;
Minim[++u1]=j;
Maxim[++u2]=j;
if((j-Minim[p1])>=y)
p1++;
if((j-Maxim[p2])>=y)
p2++;
if(j>=y){
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;u1=1;p2=1;u2=1;
Minim[1]=1;Maxim[1]=1;
for(j=2;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--;
Minim[++u1]=j;
Maxim[++u2]=j;
if((j-Minim[p1])>=x)
p1++;
if((j-Maxim[p2])>=x)
p2++;
if(j>=x){
temp=mod(Min[Minim[p1]][i]-Max[Maxim[p2]][i]);
if(temp<sol){
sol=temp;
nr=1;
}
else if(temp==sol)
nr++;
}
}
}
}
int main(){
read();
while(p--){
f>>a>>b;
sol=2000000000;
solve(a,b);
if(a!=b)
solve(b,a);
g<<sol<<" "<<nr;
g<<"\n";
}
return 0;
}