Pagini recente » Cod sursa (job #226173) | Cod sursa (job #3234097) | Cod sursa (job #3265107) | Borderou de evaluare (job #702953) | Cod sursa (job #3271518)
#include <fstream>
#include <deque>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
int n, m, q;
int v[1005][1005];
int xmax[1005][1005];
int xmin[1005][1005];
int INF = (1 << 30);
pair<int, int> solve(int dx, int dy)
{
int rez = INF;
int nr = 0;
for(int i = 1; i<=n; i++)
{
deque<int> dmin;
deque<int> dmax;
for(int j = 1; j<=m; j++)
{
while(!dmin.empty() && v[i][j] <= v[i][dmin.back()])
{
dmin.pop_back();
}
while(!dmax.empty() && v[i][j] >= v[i][dmax.back()])
{
dmax.pop_back();
}
dmin.push_back(j);
dmax.push_back(j);
if(dmin.front() == j - dy)
{
dmin.pop_front();
}
if(dmax.front() == j - dy)
{
dmax.pop_front();
}
if(j >= dy)
{
xmin[i][j] = v[i][dmin.front()];
xmax[i][j] = v[i][dmax.front()];
}
}
}
/*for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
out<<xmin[i][j]<<" ";
}
out<<'\n';
}
out<<'\n';
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
out<<xmax[i][j]<<" ";
}
out<<'\n';
}*/
for(int j = dy; j<=m; j++)
{
deque<int> dmin;
deque<int> dmax;
for(int i = 1; i<=n; i++)
{
while(!dmin.empty() && xmin[i][j] <= xmin[dmin.back()][j])
{
dmin.pop_back();
}
while(!dmax.empty() && xmax[i][j] >= xmax[dmax.back()][j])
{
dmax.pop_back();
}
dmin.push_back(i);
dmax.push_back(i);
if(dmin.front() == i - dx)
{
dmin.pop_front();
}
if(dmax.front() == i - dx)
{
dmax.pop_front();
}
if(i >= dx)
{
//out<<i<<" "<<j<<" "<<xmax[dmax.front()][j]<<" "<<xmin[dmin.front()][j]<<'\n';
if(xmax[dmax.front()][j] - xmin[dmin.front()][j] < rez)
{
rez = xmax[dmax.front()][j] - xmin[dmin.front()][j];
nr = 1;
}
else if(xmax[dmax.front()][j] - xmin[dmin.front()][j] == rez)
{
nr++;
}
}
}
}
return {rez, nr};
}
int main()
{
in>>n>>m>>q;
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
in>>v[i][j];
}
}
int x, y;
pair<int, int> ans1, ans2;
while(q--)
{
in>>x>>y;
if(x == y)
{
ans1 = solve(x, y);
out<<ans1.first<<" "<<ans1.second<<'\n';
}
else
{
ans1 = solve(x, y);
ans2 = solve(y, x);
if(ans1.first > ans2.first)
{
out<<ans1.first<<" "<<ans1.second<<'\n';
}
else if(ans1.first < ans2.first)
{
out<<ans2.first<<" "<<ans2.second<<'\n';
}
else
{
out<<ans1.first<<" "<<ans1.second + ans2.second<<'\n';
}
}
}
return 0;
}