Pagini recente » Cod sursa (job #2505744) | Cod sursa (job #843722) | Cod sursa (job #1245870) | Cod sursa (job #730258) | Cod sursa (job #3289488)
#include <bits/stdc++.h>
using namespace std;
const string NUMEFISIER="struti";
ifstream fin(NUMEFISIER+".in");
ofstream fout(NUMEFISIER+".out");
const int Nmax=1001;
int a[Nmax][Nmax],n,m;
pair<int, int> query(int DX, int DY)
{
int difmin=INT_MAX,nr=0;
deque<pair<int, int>> dqmin,dqmax;
vector<deque<int>> vmax(m),vmin(m);
for(int j=1; j<=m; j++)
{
for(int i=1; i<DX; i++)
{
while(!vmin[j-1].empty() && a[vmin[j-1].back()][j]>=a[i][j])
vmin[j-1].pop_back();
vmin[j-1].push_back(i);
while(!vmax[j-1].empty() && a[vmax[j-1].back()][j]<=a[i][j])
vmax[j-1].pop_back();
vmax[j-1].push_back(i);
}
}
for(int i=DX; i<=n; i++)
{
dqmin.clear(); dqmax.clear();
for(int j=1; j<=m; j++)
{
while(!vmin[j-1].empty() && a[vmin[j-1].back()][j]>=a[i][j])
vmin[j-1].pop_back();
vmin[j-1].push_back(i);
while(vmin[j-1].front()<=i-DX)
vmin[j-1].pop_front();
while(!vmax[j-1].empty() && a[vmax[j-1].back()][j]<=a[i][j])
vmax[j-1].pop_back();
vmax[j-1].push_back(i);
while(vmax[j-1].front()<=i-DX)
vmax[j-1].pop_front();
int cvmax=a[vmax[j-1].front()][j],cvmin=a[vmin[j-1].front()][j];
while(!dqmin.empty() && dqmin.back().first>=cvmin)
dqmin.pop_back();
dqmin.push_back(make_pair(cvmin, j));
if(dqmin.front().second<=j-DY)
dqmin.pop_front();
while(!dqmax.empty() && dqmax.back().first<=cvmax)
dqmax.pop_back();
dqmax.push_back(make_pair(cvmax, j));
if(dqmax.front().second<=j-DY)
dqmax.pop_front();
if(j<DY) continue;
if(difmin>dqmax.front().first-dqmin.front().first)
{
difmin=dqmax.front().first-dqmin.front().first;
nr=1;
}
else if(difmin==dqmax.front().first-dqmin.front().first)
{
nr++;
}
}
}
return make_pair(difmin, nr);
}
int main()
{
int Q;
fin>>n>>m>>Q;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
fin>>a[i][j];
int lmax,cmax;
for(int q=1; q<=Q; q++)
{
fin>>lmax>>cmax;
auto ans1=query(lmax, cmax);
if(lmax==cmax)
{
fout<<ans1.first<<' '<<ans1.second<<'\n';
continue;
}
auto ans2=query(cmax, lmax);
if(ans1.first<ans2.first)
{
fout<<ans1.first<<' '<<ans1.second<<'\n';
}
else if(ans2.first<ans1.first)
{
fout<<ans2.first<<' '<<ans2.second<<'\n';
}
else fout<<ans1.first<<' '<<ans1.second+ans2.second<<'\n';
}
return 0;
}