Pagini recente » Cod sursa (job #2940417) | Cod sursa (job #1499769) | Cod sursa (job #97415) | Cod sursa (job #304396) | Cod sursa (job #2085371)
#include <bits/stdc++.h>
#define MAXN 1000
#define BUF_SIZE 1 << 14
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
if(pbuf==BUF_SIZE){
fread(buf, BUF_SIZE, 1, fi);
pbuf=0;
}
return buf[pbuf++];
}
inline short nextnum(){
short a = 0;
char c = nextch();
while(!isdigit(c))
c = nextch();
while(isdigit(c)){
a = a * 10 + c - '0';
c = nextch();
}
return a;
}
short m, n;
short a;
struct Ans{
short min;
int nr;
};
short v[1001][1001];
struct deque{
int v[1001];
int p = 0, u = -1;
};
deque d[1001];
deque D[1001];
deque min, max;
short minval, maxval;
short e[1001];
short E[1001];
inline Ans Compute(short dx, short dy){
Ans ans;
ans.min = 10000;
for(short i = 1; i <= m; ++i){
d[i].p = 0;
d[i].u = -1;
D[i].p = 0;
D[i].u = -1;
}
for(short j = 1; j <= n; ++j){
min.p = 0;
min.u = -1;
max.p = 0;
max.u = -1;
for(short i = 1; i <= m; ++i){
//minim
if(d[i].p <= d[i].u && j - d[i].v[d[i].p] + 1 > dx)
d[i].p++;
while(d[i].p <= d[i].u && v[i][d[i].v[d[i].u]] > v[i][j])
d[i].u--;
d[i].v[++d[i].u] = j;
e[i] = d[i].v[d[i].p];
//maxim
if(D[i].p <= D[i].u && j - D[i].v[D[i].p] + 1 > dx)
D[i].p++;
while(D[i].p <= D[i].u && v[i][D[i].v[D[i].u]] < v[i][j])
D[i].u--;
D[i].v[++D[i].u] = j;
E[i] = D[i].v[D[i].p];
}
for(short i = 1; i <= m; ++i){
//minim
if(min.p <= min.u && i - min.v[min.p] + 1 > dy)
min.p++;
a = v[i][e[i]];
while(min.p <= min.u && v[min.v[min.u]][e[min.v[min.u]]] > a)
min.u--;
min.v[++min.u] = i;
//maxim
if(max.p <= max.u && i - max.v[max.p] + 1 > dy)
max.p++;
a = v[i][E[i]];
while(max.p <= max.u && v[max.v[max.u]][E[max.v[max.u]]] < a)
max.u--;
max.v[++max.u] = i;
minval = v[min.v[min.p]][e[min.v[min.p]]];
maxval = v[max.v[max.p]][E[max.v[max.p]]];
if(i >= dy && j >= dx){
if(maxval - minval < ans.min){
ans.min = maxval - minval;
ans.nr = 0;
}
if(maxval - minval == ans.min)
ans.nr++;
}
}
}
return ans;
}
int main(){
fi=fopen("struti.in","r");
fo=fopen("struti.out","w");
short p, dx, dy;
m = nextnum(), n = nextnum(), p = nextnum();
for(short i = 1; i <= m; ++i)
for(short j = 1; j <= n; ++j)
v[i][j] = nextnum();
for(short i = 1; i <= p; ++i){
dx = nextnum();
dy = nextnum();
Ans a = Compute(dx, dy);
Ans b = Compute(dy, dx);
if(dx == dy)
fprintf(fo,"%hd %d\n", a.min, a.nr);
else{
if(a.min < b.min)
fprintf(fo,"%hd %d\n", a.min, a.nr);
else if(a.min == b.min)
fprintf(fo,"%hd %d\n", a.min, a.nr + b.nr);
else
fprintf(fo,"%hd %d\n", b.min, b.nr);
}
}
fclose(fi);
fclose(fo);
return 0;
}