Pagini recente » Cod sursa (job #2249512) | Cod sursa (job #1473983) | Cod sursa (job #2212690) | Cod sursa (job #2239412) | Cod sursa (job #1542751)
#include <fstream>
#include <iostream>
#include <deque>
#define N 1002
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int M[N][N],m1[N][N],m2[N][N],a[N][N],i,j,n,m,q,x,y,rasp,nr;
deque<int> mini,maxi;
void showmaxi(deque<int> d)
{
cout<<"maxi:";
for (int i=0;i<d.size();++i)
cout<<m2[j][d[i]]<<" ";
cout<<endl;
}
void showmini(deque<int> d)
{
cout<<"mini:";
for (int i=0;i<d.size();++i)
cout<<m1[j][d[i]]<<" ";
cout<<endl;
}
void showm(int a[][N])
{
for (int i = 1;i<=n;++i,g<<'\n')
for(int j = 1;j<=m;++j)
g<<a[i][j]<<" ";
g<<'\n';
}
void Solve(int x,int y)
{
--x,--y;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
m1[i][j] = m2[i][j] = M[i][j];
for (i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
while(mini.size() && M[i][mini.back()] > M[i][j])mini.pop_back();
mini.push_back(j);
if (j - y > mini.front())mini.pop_front();
while(maxi.size() && M[i][maxi.back()] < M[i][j])maxi.pop_back();
maxi.push_back(j);
if (j - y > maxi.front())maxi.pop_front();
m1[i][j]=M[i][mini.front()],
m2[i][j]=M[i][maxi.front()];
//show(mini);
}
mini.clear();
maxi.clear();
}
//showm(m1);
//showm(m2);
++x,++y;
for (j=y;j<=m;++j)
{
for(i=1;i<=n;++i)
{
while(mini.size() && m1[mini.back()][j] > m1[i][j])mini.pop_back();
mini.push_back(i);
if (i - x >= mini.front())mini.pop_front();
while(maxi.size() && m2[maxi.back()][j] < m2[i][j])maxi.pop_back();
maxi.push_back(i);
if (i - x >= maxi.front())maxi.pop_front();
if (i - x >= 0)
{
if (m2[maxi.front()][j] - m1[mini.front()][j] < rasp)
{
rasp = m2[maxi.front()][j] - m1[mini.front()][j];
nr = 1;
}
else if (m2[maxi.front()][j] - m1[mini.front()][j] == rasp)
++nr;
//g<<m2[j][maxi.front()] << " " << m1[j][mini.front()]<<'\n';
}
}
mini.clear();
maxi.clear();
}
}
int main()
{
f>>n>>m>>q;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
f>>M[i][j];
while(q--)
{
f>>x>>y;
rasp=1<<30,nr=0;
Solve(x,y);
if(x!=y)Solve(y,x);
g<<rasp<<" "<<nr<<'\n';
}
return 0;
}