Pagini recente » Cod sursa (job #795854) | Cod sursa (job #50912) | Cod sursa (job #2288919) | Cod sursa (job #3330731) | Cod sursa (job #3320632)
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
using namespace std;
ifstream in("struti.in");ofstream out("struti.out");
const int MAX_NR=1001;
int mat[MAX_NR][MAX_NR];
int min_final[MAX_NR][MAX_NR];
int max_final[MAX_NR][MAX_NR];
int temp_min[MAX_NR][MAX_NR];
int temp_max[MAX_NR][MAX_NR];
int m,n,p,A,B;//A=dx,B=dy;dy reprezinta lungimea ferestrei adica am o ferestra de latime A si lungime B
int min_global_diff,nr_total;
void citire(){
in>>m>>n>>p;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>mat[i][j];
}
pair<int,int> proceseaza_dimensiunea(int DX,int DY){
int N_max=n-DY+1;
for(int i=1;i<=m;i++){
deque<int>dq_min,dq_max;
for(int j=1;j<=n;j++){
while(!dq_min.empty() && dq_min.front()<=j-DY)
dq_min.pop_front();
while(!dq_min.empty() && mat[i][j]<=mat[i][dq_min.back()])
dq_min.pop_back();
while(!dq_max.empty() && dq_max.front()<=j-DY)
dq_max.pop_front();
while(!dq_max.empty() && mat[i][j]>=mat[i][dq_max.back()])
dq_max.pop_back();
dq_min.push_back(j);
dq_max.push_back(j);
if(j>=DY){
temp_min[i][j-DY+1]=mat[i][dq_min.front()];
temp_max[i][j-DY+1]=mat[i][dq_max.front()];
}
}
}
int M_max=m-DX+1;
for(int j=1;j<=N_max;j++){
deque<int>dq_min,dq_max;
for(int i=1;i<=m;i++){
while(!dq_min.empty() && dq_min.front()<=i-DX)
dq_min.pop_front();
while(!dq_min.empty() && temp_min[i][j]<=temp_min[dq_min.back()][j])
dq_min.pop_back();
while(!dq_max.empty() && dq_max.front()<=i-DX)
dq_max.pop_front();
while(!dq_max.empty() && temp_max[i][j]>=temp_max[dq_max.back()][j])
dq_max.pop_back();
dq_min.push_back(i);
dq_max.push_back(i);
if(i>=DX){
min_final[i-DX+1][j]=temp_min[dq_min.front()][j];
max_final[i-DX+1][j]=temp_max[dq_max.front()][j];
}
}
}
min_global_diff=100000;
nr_total=0;
for(int i=1;i<=M_max;i++){
for(int j=1;j<=N_max;j++){
int dif=max_final[i][j]-min_final[i][j];
if(dif<min_global_diff){
min_global_diff=dif;
nr_total=1;
}
else if(dif==min_global_diff){
nr_total++;
}
}
}
return {min_global_diff,nr_total};
}
int main(){
citire();
vector<pair<int,int>>rez_final;
for(int k=1;k<=p;k++){
int dx,dy;
in>>dx>>dy;
pair<int,int> rez1=proceseaza_dimensiunea(dx,dy);
int min_global=rez1.first;
int nr_total=rez1.second;
if(dx!=dy){
pair<int,int> rez2=proceseaza_dimensiunea(dy,dx);
if(rez2.first<min_global){
min_global=rez2.first;
nr_total=rez2.second;
}if(rez2.first==min_global){
nr_total+=rez2.second;
}
}
rez_final.push_back({min_global,nr_total});
}
for(const auto& rez : rez_final){
out<<rez.first<<" "<<rez.second<<"\n";
}
}