Pagini recente » Cod sursa (job #441104) | Clasament gfdgsfdgsd | Cod sursa (job #704043) | Cod sursa (job #3190477) | Cod sursa (job #2050802)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
using namespace std;
ifstream si("struti.in");
ofstream so("struti.out");
deque<int> dmin;
deque<int> dmax;
int v[1005][1005];
int max1[1005][1005];
int max2[1005][1005];
int min1[1005][1005];
int min2[1005][1005];
int n,m,p;
int calc(int sol,int x,int y)
{
int cont=0;
for(int i=1;i<=n-y+1;i++)
{
for(int j=1;j<=m-x+1;j++)
{
if(max2[i][j]-min2[i][j]==sol)
{
cont++;
}
}
}
return cont;
}
pair<int,int> rez(int x,int y)
{
for(int i=1;i<=n;i++)
{
dmin.clear();
dmax.clear();
for(int j=1;j<=x;j++)
{
while(dmin.size()&&v[i][j]<=v[i][dmin.back()])
{
dmin.pop_back();
}
while(dmax.size()&&v[i][j]>=v[i][dmax.back()])
{
dmax.pop_back();
}
dmin.push_back(j);
dmax.push_back(j);
}
min1[i][1]=v[i][dmin.front()];
max1[i][1]=v[i][dmax.front()];
for(int j=x+1;j<=m;j++)
{
if(dmin.front()<=j-x)
{
dmin.pop_front();
}
if(dmax.front()<=j-x)
{
dmax.pop_front();
}
while(dmin.size()&&v[i][j]<=v[i][dmin.back()])
{
dmin.pop_back();
}
while(dmax.size()&&v[i][j]>=v[i][dmax.back()])
{
dmax.pop_back();
}
dmin.push_back(j);
dmax.push_back(j);
min1[i][j-x+1]=v[i][dmin.front()];
max1[i][j-x+1]=v[i][dmax.front()];
}
}
for(int j=1;j<=m-x+1;j++)
{
dmin.clear();
dmax.clear();
for(int i=1;i<=y;i++)
{
while(dmin.size()&&min1[i][j]<=min1[dmin.back()][j])
{
dmin.pop_back();
}
while(dmax.size()&&max1[i][j]>=max1[dmax.back()][j])
{
dmax.pop_back();
}
dmin.push_back(i);
dmax.push_back(i);
}
min2[1][j]=min1[dmin.front()][j];
max2[1][j]=max1[dmax.front()][j];
for(int i=y+1;i<=n;i++)
{
if(dmin.front()<=i-y)
{
dmin.pop_front();
}
if(dmax.front()<=i-y)
{
dmax.pop_front();
}
while(dmin.size()&&min1[i][j]<=min1[dmin.back()][j])
{
dmin.pop_back();
}
while(dmax.size()&&max1[i][j]>=max1[dmax.back()][j])
{
dmax.pop_back();
}
dmin.push_back(i);
dmax.push_back(i);
min2[i-y+1][j]=min1[dmin.front()][j];
max2[i-y+1][j]=max1[dmax.front()][j];
}
}
int sol=1000000000;
for(int i=1;i<=n-y+1;i++)
{
for(int j=1;j<=m-x+1;j++)
{
sol=min(max2[i][j]-min2[i][j],sol);
}
}
int cnt=calc(sol,x,y);
return make_pair(sol,cnt);
}
int main()
{
si>>n>>m>>p;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
si>>v[i][j];
while(p--)
{
int x,y;
si>>x>>y;
pair<int,int>sol1=rez(x,y);
if(x==y)
{
so<<sol1.first<<' '<<sol1.second<<'\n';
continue;
}
pair<int,int>sol2=rez(y,x);
if(sol1.first==sol2.first)
{
so<<sol1.first<<' '<<sol2.second+sol1.second<<'\n';
continue;
}
if(sol1.first>sol2.first)
so<<sol2.first<<' '<<sol2.second<<'\n';
else
so<<sol1.first<<' '<<sol1.second<<'\n';
}
return 0;
}