Pagini recente » Cod sursa (job #2260899) | Cod sursa (job #659075) | Cod sursa (job #2195074) | Cod sursa (job #1992267) | Cod sursa (job #1832890)
#include <cstdio>
#include <cctype>
#define BUF_SIZE 1<<17
#define INF 1000000000
#define MAXN 1000
int ans, pos=BUF_SIZE, dq1[MAXN+1], dq2[MAXN+1], sef1[MAXN+1], sef2[MAXN+1];
int rez, nrlin, nrcol, m[MAXN+1][MAXN+1], u[MAXN+1][MAXN+1], e[MAXN+1][MAXN+1];
char buf[BUF_SIZE];
FILE *fin;
inline int nextch(){
if(pos==BUF_SIZE){
fread(buf, BUF_SIZE, 1, fin);
pos=0;
}
return buf[pos++];
}
inline int read(){
int x=0;
char ch=nextch();
while(!isdigit(ch)){
ch=nextch();
}
while(isdigit(ch)){
x=10*x+ch-'0';
ch=nextch();
}
return x;
}
inline void solve(int dx, int dy){
int left1, right1, left2, right2, x;
for(int j=1; j<=nrcol; j++){
int st1=0, st2=0, dr1=0, dr2=0;
for(int i=1; i<=nrlin; i++){
if((st1<dr1)&&(dq1[st1]==i-dy)){
st1++;
}
while((st1<dr1)&&(m[dq1[dr1-1]][j]>=m[i][j])){
dr1--;
}
dq1[dr1++]=i;
if((st2<dr2)&&(dq2[st2]==i-dy)){
st2++;
}
while((st2<dr2)&&(m[dq2[dr2-1]][j]<=m[i][j])){
dr2--;
}
dq2[dr2++]=i;
u[i][j]=m[dq1[st1]][j];
e[i][j]=m[dq2[st2]][j];
}
}
for(int i=1; i<=nrlin; i++){
left1=right1=left2=right2=0;
for(int j=1; j<=nrcol; j++){
if((left1<right1)&&(sef1[left1]==j-dx)){
left1++;
}
while((left1<right1)&&(u[i][sef1[right1-1]]>=u[i][j])){
right1--;
}
sef1[right1++]=j;
if((left2<right2)&&(sef2[left2]==j-dx)){
left2++;
}
while((left2<right2)&&(e[i][sef2[right2-1]]<=e[i][j])){
right2--;
}
sef2[right2++]=j;
x=e[i][sef2[left2]]-u[i][sef1[left1]];
if((i>=dy)&&(j>=dx)){
if(ans==x){
rez++;
}else if(ans>x){
ans=x;
rez=1;
}
}
}
}
}
int main(){
int q, i, dx, dy, j;
FILE *fout;
fin=fopen("struti.in", "r");
fout=fopen("struti.out", "w");
nrlin=read();
nrcol=read();
q=read();
for(i=1; i<=nrlin; i++){
for(j=1; j<=nrcol; j++){
m[i][j]=read();
}
}
for(i=0; i<q; i++){
dx=read();
dy=read();
ans=INF;
rez=0;
solve(dx, dy);
if(dx!=dy){
solve(dy, dx);
}
fprintf(fout, "%d %d\n", ans, rez);
}
fclose(fin);
fclose(fout);
return 0;
}