Pagini recente » Cod sursa (job #2071052) | Cod sursa (job #473357) | Cod sursa (job #1952964) | Monitorul de evaluare | Cod sursa (job #3031552)
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int Nmax = 1005;
int a[Nmax][Nmax],s[Nmax][Nmax],m[Nmax][Nmax],mm[Nmax][Nmax];
deque<int> dq;
void find_min(int x, int y, int N, int M){
int i,j;
for(j=1;j<=M;j++){
for(i=1;i<=N;i++){
while(!dq.empty() && a[i][j]<=a[dq.back()][j])
dq.pop_back();
dq.push_back(i);
if(i>=x){
if(dq.front()<i-x+1)
dq.pop_front();
s[i-x+1][j] = a[dq.front()][j];
}
}
while(!dq.empty())
dq.pop_back();
}
for(i=1;i<=N-x+1;i++){
for(j=1;j<=M;i++){
while(!dq.empty() && s[i][j]<=s[i][dq.back()])
dq.pop_back();
dq.push_back(j);
if(j>=y){
if(dq.front()<j-y+1)
dq.pop_front();
m[i][j-y+1] = s[i][dq.front()];
}
}
while(!dq.empty())
dq.pop_back();
}
}
void find_max(int x, int y, int N, int M){
int i,j;
for(j=1;j<=M;j++){
for(i=1;i<=N;i++){
while(!dq.empty() && a[i][j]>=a[dq.back()][j])
dq.pop_back();
dq.push_back(i);
if(i>=x){
if(dq.front()<i-x+1)
dq.pop_front();
s[i-x+1][j] = a[dq.front()][j];
}
}
while(!dq.empty())
dq.pop_back();
}
for(i=1;i<=N-x+1;i++){
for(j=1;j<=M;i++){
while(!dq.empty() && s[i][j]>=s[i][dq.back()])
dq.pop_back();
dq.push_back(j);
if(j>=y){
if(dq.front()<j-y+1)
dq.pop_front();
mm[i][j-y+1] = s[i][dq.front()];
}
}
while(!dq.empty())
dq.pop_back();
}
}
int main()
{
int M,N,P,x,y,i,j,p,dif,aux,nr;
fin >> N >> M >> P;
for(i=1;i<=N;i++){
for(j=1;j<=M;j++)
fin >> a[i][j];
}
for(p=0;p<P;p++){
fin >> x >> y;
find_min(x,y,N,M);
find_max(x,y,N,M);
dif = 8005;
for(i=1;i<=N-x+1;i++){
for(j=1;j<=M-y+1;j++){
if(mm[i][j]-m[i][j]<dif){
nr = 1;
dif = mm[i][j]-m[i][j];
}
if(mm[i][j]-m[i][j] == dif)
nr++;
}
}
if(x!=y){
aux = x;
x = y;
y = aux;
find_min(x,y,N,M);
find_max(x,y,N,M);
for(i=1;i<=N-x+1;i++){
for(j=1;j<=M-y+1;j++){
if(mm[i][j]-m[i][j]<dif){
nr = 1;
dif = mm[i][j]-m[i][j];
}
if(mm[i][j]-m[i][j] == dif)
nr++;
}
}
fout << dif << " " << nr << '\n';
}
}
return 0;
}