Pagini recente » Clasament FMI No Stress 6 | Cod sursa (job #2294451) | Cod sursa (job #1290722) | Cod sursa (job #3187538) | Cod sursa (job #3289484)
#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)
{
vector<tuple<int, int, int, int>> rezMat;
int difmin=INT_MAX,nr=0;
for(int i=1; i<=n-DX+1; i++)
{
deque<pair<int, int>> dqmin,dqmax;
for(int j=1; j<=m; j++)
{
int vmax=INT_MIN,vmin=INT_MAX;
for(int k=i; k<i+DX; k++)
{
vmax=max(vmax, a[k][j]);
vmin=min(vmin, a[k][j]);
}
while(!dqmin.empty() && dqmin.back().first>=vmin)
dqmin.pop_back();
dqmin.push_back(make_pair(vmin, j));
if(dqmin.front().second<=j-DY)
dqmin.pop_front();
while(!dqmax.empty() && dqmax.back().first<=vmax)
dqmax.pop_back();
dqmax.push_back(make_pair(vmax, 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=0;
rezMat.clear();
}
if(difmin==dqmax.front().first-dqmin.front().first)
{
nr++;
rezMat.push_back(make_tuple(i, j-DY+1, i+DX-1, j));
}
}
}
if(DX!=DY)
{
for(int i=1; i<=n-DY+1; i++)
{
deque<pair<int, int>> dqmin,dqmax;
for(int j=1; j<=m; j++)
{
int vmax=INT_MIN,vmin=INT_MAX;
for(int k=i; k<i+DY; k++)
{
vmax=max(vmax, a[k][j]);
vmin=min(vmin, a[k][j]);
}
while(!dqmin.empty() && dqmin.back().first>=vmin)
dqmin.pop_back();
dqmin.push_back(make_pair(vmin, j));
if(dqmin.front().second<=j-DX)
dqmin.pop_front();
while(!dqmax.empty() && dqmax.back().first<=vmax)
dqmax.pop_back();
dqmax.push_back(make_pair(vmax, j));
if(dqmax.front().second<=j-DX)
dqmax.pop_front();
if(j<DX) continue;
if(difmin>dqmax.front().first-dqmin.front().first)
{
difmin=dqmax.front().first-dqmin.front().first;
nr=0;
rezMat.clear();
}
if(difmin==dqmax.front().first-dqmin.front().first)
{
nr++;
rezMat.push_back(make_tuple(i, j-DX+1, i+DY-1, j));
}
}
}
}
// for(unsigned int i=0; i<rezMat.size(); i++)
// cout<<get<0>(rezMat[i])<<' '<<get<1>(rezMat[i])<<' '<<get<2>(rezMat[i])<<' '<<get<3>(rezMat[i])<<'\n';
// cout<<'\n';
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 ans=query(lmax, cmax);
fout<<ans.first<<' '<<ans.second<<'\n';
}
return 0;
}