Pagini recente » Cod sursa (job #2807062) | Cod sursa (job #3149836) | Cod sursa (job #2984389) | Cod sursa (job #2903257) | Cod sursa (job #2464665)
#include <bits/stdc++.h>
#define NM 1005
#define val first
#define poz second
#define pb push_back
#define pii pair<int,int>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,k,p,q,difMin,nrap,a[NM][NM],v[NM][NM];
int minVal[NM*NM],maxVal[NM*NM];
deque <pii> dqMin[NM],dqMax[NM];
void Read();
void Solve();
void clearDQ();
void findSol();
int main()
{ Read();
Solve();
f.close();
g.close();
return 0;
}
void Read()
{ f>>n>>m>>k;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
f>>a[i][j];
}
void Solve()
{ while(k--)
{ f>>p>>q;
difMin=(1<<30);
nrap=1;
findSol();
if(p!=q)
{ swap(p,q);
findSol();
}
g<<difMin<<' '<<nrap<<'\n';
}
}
void findSol()
{ clearDQ();
for(int i=1; i<=n; i++)
{ for(int j=1; j<=m; j++)
{ if(j-p+1>0)
if(dqMin[i].front().poz<j-p+1)
dqMin[i].pop_front();
if(!dqMin[i].empty())
while(a[i][j]<=dqMin[i].back().val)
{ dqMin[i].pop_back();
if(dqMin[i].empty())
break;
}
dqMin[i].pb({a[i][j],j});
if(j-p+1>0)
v[i][j]=dqMin[i].front().val;
}
}
clearDQ();
int ind=0;
for(int j=p; j<=m; j++)
{ for(int i=1; i<=n; i++)
{ if(i-q+1>0)
if(dqMin[j].front().poz<i-q+1)
dqMin[j].pop_front();
if(!dqMin[j].empty())
while(v[i][j]<=dqMin[j].back().val)
{ dqMin[j].pop_back();
if(dqMin[j].empty())
break;
}
dqMin[j].pb({v[i][j],i});
if(i-q+1>0)
minVal[++ind]=dqMin[j].front().val;
}
}
clearDQ();
for(int i=1; i<=n; i++)
{ for(int j=1; j<=m; j++)
{ if(j-p+1>0)
if(dqMax[i].front().poz<j-p+1)
dqMax[i].pop_front();
if(!dqMax[i].empty())
while(a[i][j]>=dqMax[i].back().val)
{ dqMax[i].pop_back();
if(dqMax[i].empty())
break;
}
dqMax[i].pb({a[i][j],j});
if(j-p+1>0)
v[i][j]=dqMax[i].front().val;
}
}
ind=0;
clearDQ();
for(int j=p; j<=m; j++)
{ for(int i=1; i<=n; i++)
{ if(i-q+1>0)
if(dqMax[j].front().poz<i-q+1)
dqMax[j].pop_front();
if(!dqMax[j].empty())
while(v[i][j]>=dqMax[j].back().val)
{ dqMax[j].pop_back();
if(dqMax[j].empty())
break;
}
dqMax[j].pb({v[i][j],i});
if(i-q+1>0)
maxVal[++ind]=dqMax[j].front().val;
}
}
for(int i=1; i<=ind; i++)
{ int dif=maxVal[i]-minVal[i];
if(dif<difMin)
{ difMin=dif;
nrap=1;
}
else
if(dif==difMin)
nrap++;
}
}
void clearDQ()
{ for(int i=1; i<NM; i++)
while(!dqMin[i].empty())
dqMin[i].pop_back();
for(int i=1; i<NM; i++)
while(!dqMax[i].empty())
dqMax[i].pop_back();
}