Pagini recente » Cod sursa (job #2869177) | Cod sursa (job #1024679) | Cod sursa (job #101167) | Cod sursa (job #2366774) | Cod sursa (job #2776062)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("struti.in");
ofstream g ("struti.out");
int n,m;
int mt[1005][1005];
int minim[1005][1005];
int maxim[1005][1005];
int q;
int nrminim=9999999;
int cont=0;
void fct(int lin , int col)
{
deque <pair<int,int>> st;
for(int j=1; j<=m; ++j)
{
for(int i=1; i<=lin-1; ++i)
{
while(!st.empty() && st.back().first<mt[i][j])
st.pop_back();
st.push_back({mt[i][j], i});
}
for(int i=lin; i<=n; ++i)
{
if(!st.empty() && i-st.front().second>=lin)
st.pop_front();
while(!st.empty() && st.back().first<mt[i][j])
st.pop_back();
st.push_back({mt[i][j], i});
maxim[i][j]=st.front().first;
}
while(!st.empty())
st.pop_back();
}
while(!st.empty())
st.pop_back();
for(int j=1; j<=m; ++j)
{
for(int i=1; i<=lin-1; ++i)
{
while(!st.empty() && st.back().first>mt[i][j])
st.pop_back();
st.push_back({mt[i][j], i});
}
for(int i=lin; i<=n; ++i)
{
if(!st.empty() && i-st.front().second>=lin)
st.pop_front();
while(!st.empty() && st.back().first>mt[i][j])
st.pop_back();
st.push_back({mt[i][j], i});
minim[i][j]=st.front().first;
}
while(!st.empty())
st.pop_back();
}
deque <pair<int,int>> mini;
deque <pair<int, int >> maxi;
for(int i=lin; i<=n; ++i)
{
for(int j=1; j<col; ++j)
{
while(!maxi.empty() && maxi.back().first<maxim[i][j])
maxi.pop_back();
maxi.push_back({maxim[i][j], j});
while(!mini.empty() && mini.back().first>minim[i][j])
mini.pop_back();
mini.push_back({minim[i][j], j});
}
for(int j=col; j<=m; ++j)
{
if(!maxi.empty() && j-maxi.front().second>=col)
maxi.pop_front();
while(!maxi.empty() && maxi.back().first<maxim[i][j])
maxi.pop_back();
maxi.push_back({maxim[i][j], j});
if(!mini.empty() && j-mini.front().second>=col)
mini.pop_front();
while(!mini.empty() && mini.back().first>minim[i][j])
mini.pop_back();
mini.push_back({minim[i][j], j});
if(maxi.front().first-mini.front().first<nrminim)
{
nrminim=maxi.front().first-mini.front().first;
cont=1;
}
else if(maxi.front().first-mini.front().first==nrminim)
{
++cont;
}
}
while(!mini.empty())
mini.pop_back();
while(!maxi.empty())
maxi.pop_back();
}
}
int main()
{
f>>n>>m>>q;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
f>>mt[i][j];
}
for(int query=1; query<=q; ++query)
{
int lin,col;
f>>lin>>col;
nrminim=9999999;
cont=0;
fct(lin , col);
if(lin!=col)
fct(col , lin);
g<<nrminim<<" "<<cont<<"\n";
}
return 0;
}