Pagini recente » Cod sursa (job #1370724) | Cod sursa (job #377289) | Cod sursa (job #1387478) | Cod sursa (job #2515858) | Cod sursa (job #880351)
Cod sursa(job #880351)
#include <fstream>
#include <queue>
#include <vector>
#define INF 32000
#define MAXN 1005
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
struct element{
short int val,poz;};
short int n,m,p,a[MAXN][MAXN],mn,aux,dx,dy,mn1,mx1;
element el;
int mncnt;
deque<element> dq1,dq2;
vector<short int> v1[MAXN],v2[MAXN];
int main()
{
short int i,j,k;
f>>n>>m>>p;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>a[i][j];
for(k=1;k<=2*p;k++){
if(k%2){
mn=INF;
f>>dx>>dy;}
else{
if(dx==dy){
g<<mn<<' '<<mncnt<<'\n';
continue;}
aux=dx;
dx=dy;
dy=aux;}
for(j=1;j<=m;j++){
for(i=1;i<dx;i++){
el.poz=i;
el.val=a[i][j];
while(!dq1.empty()&&dq1.back().val>el.val)
dq1.pop_back();
dq1.push_back(el);
while(!dq2.empty()&&dq2.back().val<el.val)
dq2.pop_back();
dq2.push_back(el);}
for(i=dx;i<=n;i++){
el.poz=i;
el.val=a[i][j];
while(!dq1.empty()&&dq1.back().val>el.val)
dq1.pop_back();
dq1.push_back(el);
while(!dq2.empty()&&dq2.back().val<el.val)
dq2.pop_back();
dq2.push_back(el);
while(dq1.front().poz<=i-dx)
dq1.pop_front();
v1[j].push_back(dq1.front().val);
el=dq2.front();
while(dq2.front().poz<=i-dx)
dq2.pop_front();
v2[j].push_back(dq2.front().val);}
dq1.clear();
dq2.clear();}
for(i=0;i<v1[1].size();i++){
for(j=1;j<dy;j++){
el.poz=j;
el.val=v1[j][i];
while(!dq1.empty()&&dq1.back().val>el.val)
dq1.pop_back();
dq1.push_back(el);
el.val=v2[j][i];
while(!dq2.empty()&&dq2.back().val<el.val)
dq2.pop_back();
dq2.push_back(el);}
for(j=dy;j<=m;j++){
el.poz=j;
el.val=v1[j][i];
while(!dq1.empty()&&dq1.back().val>el.val)
dq1.pop_back();
dq1.push_back(el);
el.val=v2[j][i];
while(!dq2.empty()&&dq2.back().val<el.val)
dq2.pop_back();
dq2.push_back(el);
while(dq1.front().poz<=j-dy)
dq1.pop_front();
mn1=dq1.front().val;
while(dq2.front().poz<=j-dy)
dq2.pop_front();
mx1=dq2.front().val;
if(mx1-mn1<mn){
mn=mx1-mn1;
mncnt=0;}
if(mx1-mn1==mn)
mncnt++;}
dq1.clear();
dq2.clear();}
for(j=1;j<=m;j++){
v1[j].clear();
v2[j].clear();}
if(k%2==0)
g<<mn<<' '<<mncnt<<'\n';}
f.close();
g.close();
return 0;
}