Pagini recente » Cod sursa (job #1441812) | Cod sursa (job #1198663) | Cod sursa (job #828597) | Cod sursa (job #1241456) | Cod sursa (job #2530037)
#include <bits/stdc++.h>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
//------------------------------------
///Globale
int raspuns2;
short n,m,v[1001][1001],raspuns,nr,v2[1001][1001],v3[1001][1001];
deque<pair<short,short>>dq[1001],dq2,dq3,dq4[1001];
//------------------------------------
///Functii
void citire();
//------------------------------------
int main()
{
citire();
return 0;
}
//------------------------------------
void afisare()
{
g << raspuns << " " << raspuns2 << '\n';
}
//------------------------------------
void calculare_raspuns(short c)
{
for(short i = 1; i <= nr; ++i)
{
dq2.clear();
dq3.clear();
for(short j = 1; j <= c; ++j)
{
while(!dq2.empty() && v2[i][j] < dq2.back().first)
dq2.pop_back();
dq2.push_back({v2[i][j],j});
while(!dq3.empty() && v3[i][j] > dq3.back().first)
dq3.pop_back();
dq3.push_back({v3[i][j],j});
}
short r = dq3.front().first - dq2.front().first;
if(r < raspuns)
{
raspuns = r;
raspuns2 = 1;
}
else if(r == raspuns)
raspuns2++;
for(short j = c + 1; j <= m; ++j)
{
while(!dq2.empty() && v2[i][j] < dq2.back().first)
dq2.pop_back();
dq2.push_back({v2[i][j],j});
while(!dq3.empty() && v3[i][j] > dq3.back().first)
dq3.pop_back();
dq3.push_back({v3[i][j],j});
if(dq2.front().second == j - c)
dq2.pop_front();
if(dq3.front().second == j - c)
dq3.pop_front();
short r = dq3.front().first - dq2.front().first;
if(r < raspuns)
{
raspuns = r;
raspuns2 = 1;
}
else if(r == raspuns)
raspuns2++;
}
}
}
//------------------------------------
void calculare_minim_maxim_pe_linii(short l)
{
nr = 0;
for(short i = 1; i <= m; ++i)
{
dq[i].clear();
dq4[i].clear();
}
for(short j = 1; j <= m; ++j)
for(short i = 1; i <= l; ++i)
{
while(!dq[j].empty() && v[i][j] < dq[j].back().first)
dq[j].pop_back();
dq[j].push_back({v[i][j],i});
while(!dq4[j].empty() && v[i][j] > dq4[j].back().first)
dq4[j].pop_back();
dq4[j].push_back({v[i][j],i});
}
nr++;
for(short j = 1; j <= m; ++j)
v2[nr][j] = dq[j].front().first;
for(short j = 1; j <= m; ++j)
v3[nr][j] = dq4[j].front().first;
for(short i = l + 1; i <= n; ++i)
{
nr++;
for(short j = 1; j <= m; ++j)
{
while(!dq[j].empty() && v[i][j] < dq[j].back().first)
dq[j].pop_back();
dq[j].push_back({v[i][j],i});
if(dq[j].front().second == i - l)
dq[j].pop_front();
while(!dq4[j].empty() && v[i][j] > dq4[j].back().first)
dq4[j].pop_back();
dq4[j].push_back({v[i][j],i});
if(dq4[j].front().second == i - l)
dq4[j].pop_front();
v2[nr][j] = dq[j].front().first;
v3[nr][j] = dq4[j].front().first;
}
}
}
//------------------------------------
void rezolvare(short l,short c)
{
if(l <= n && c <= m)
{
calculare_minim_maxim_pe_linii(l);
calculare_raspuns(c);
}
if(l == c)
return;
swap(l,c);
if(l <= n && c <= m)
{
calculare_minim_maxim_pe_linii(l);
calculare_raspuns(c);
}
}
//------------------------------------
void citire()
{
short p;
f >> n >> m >> p;
for(short i = 1; i <= n; ++i)
for(short j = 1; j <= m; ++j)
f >> v[i][j];
while(p--)
{
raspuns = 8001;
raspuns2 = 0;
short l,c;
f >> l >> c;
rezolvare(l,c);
afisare();
}
}