Pagini recente » Cod sursa (job #617675) | Cod sursa (job #46523) | Diferente pentru problema/bitconnect intre reviziile 35 si 48 | Monitorul de evaluare | Cod sursa (job #3331503)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int NMAX=1e3+1, INF=8e3+1;
int m, n, p, dx, dy, dif, nr;
int mat[NMAX][NMAX], minim[NMAX][NMAX], maxim[NMAX][NMAX];
void solve(int dx, int dy){
for(int i=1;i<=m;i++){
deque <int> dqmin, dqmax;
for(int j=1;j<dy;j++){
while(!dqmin.empty()&&mat[i][j]<mat[i][dqmin.back()])
dqmin.pop_back();
while(!dqmax.empty()&&mat[i][j]>mat[i][dqmax.back()])
dqmax.pop_back();
dqmin.push_back(j);
dqmax.push_back(j);
}
for(int j=dy;j<=n;j++){
while(!dqmin.empty()&&mat[i][j]<mat[i][dqmin.back()])
dqmin.pop_back();
while(!dqmax.empty()&&mat[i][j]>mat[i][dqmax.back()])
dqmax.pop_back();
if(!dqmin.empty()&&dqmin.front()==j-dy)
dqmin.pop_front();
if(!dqmax.empty()&&dqmax.front()==j-dy)
dqmax.pop_front();
dqmin.push_back(j);
dqmax.push_back(j);
minim[i][j]=dqmin.front();
maxim[i][j]=dqmax.front();
}
}
/*cout<<dx<<' '<<dy<<endl<<endl;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cout<<minim[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cout<<maxim[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;*/
for(int j=dy;j<=n;j++){
deque <int> dqmin, dqmax;
for(int i=1;i<dx;i++){
while(!dqmin.empty()&&mat[i][minim[i][j]]<mat[dqmin.back()][minim[dqmin.back()][j]])
dqmin.pop_back();
while(!dqmax.empty()&&mat[i][maxim[i][j]]>mat[dqmax.back()][maxim[dqmax.back()][j]])
dqmax.pop_back();
dqmin.push_back(i);
dqmax.push_back(i);
}
for(int i=dx;i<=m;i++){
while(!dqmin.empty()&&mat[i][minim[i][j]]<mat[dqmin.back()][minim[dqmin.back()][j]])
dqmin.pop_back();
while(!dqmax.empty()&&mat[i][maxim[i][j]]>mat[dqmax.back()][maxim[dqmax.back()][j]])
dqmax.pop_back();
if(!dqmin.empty()&&dqmin.front()==i-dx)
dqmin.pop_front();
if(!dqmax.empty()&&dqmax.front()==i-dx)
dqmax.pop_front();
dqmin.push_back(i);
dqmax.push_back(i);
if(dif>mat[dqmax.front()][maxim[dqmax.front()][j]]-mat[dqmin.front()][minim[dqmin.front()][j]]){
dif=mat[dqmax.front()][maxim[dqmax.front()][j]]-mat[dqmin.front()][minim[dqmin.front()][j]];
//cout<<i<<' '<<j<<' '<<dif<<endl;
nr=1;
}
else if(dif==mat[dqmax.front()][maxim[dqmax.front()][j]]-mat[dqmin.front()][minim[dqmin.front()][j]]){
nr++;
}
}
}
}
int main(){
fin>>m>>n>>p;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
fin>>mat[i][j];
for(int i=0;i<p;i++){
dif=INF;
nr=0;
fin>>dx>>dy;
solve(dx, dy);
if(dx!=dy)
solve(dy, dx);
fout<<dif<<' '<<nr<<'\n';
}
return 0;
}