Pagini recente » Cod sursa (job #2875745) | Cod sursa (job #2413305) | Cod sursa (job #1562380) | Clasament | Cod sursa (job #2974989)
/*
"TLE is like the wind, always by my side"
- Yasuo - 2022 -
*/
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
using namespace std;
int a[1001][1001];
deque <int> dq[1001];
deque <int> dq2[1001];
deque <int> dqmin[1001];
deque <int> dqmax[1001];
deque <int> dqminindice[1001];
deque <int> dqmaxindice[1001];
int main()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m,p,i,j,l1,l2,mi,ap,k;
fin >> n >> m >> p;
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
fin >> a[i][j];
}
}
ap=0;
mi=8001;
for (k=1; k<=p; k++)
{
fin >> l1 >> l2;
for (i=1; i<=max(n,m); i++)
{
dq[i].clear();
dq2[i].clear();
dqmin[i].clear();
dqmax[i].clear();
dqminindice[i].clear();
dqmaxindice[i].clear();
}
for (j=1; j<=m; j++)
{
for (i=1; i<=n; i++)
{
while (!dq[i].empty() && j-dq[i].front()>=l1)
dq[i].pop_front();
while (!dq2[i].empty() && j-dq2[i].front()>=l1)
dq2[i].pop_front();
while (!dq[i].empty() && a[i][j]<a[i][dq[i].back()])
dq[i].pop_back();
while (!dq2[i].empty() && a[i][j]>a[i][dq2[i].back()])
dq2[i].pop_back();
dq[i].push_back(j);
dq2[i].push_back(j);
}
if (j>=l1)
{
for (i=1; i<=n; i++)
{
while (!dqmin[j].empty() && i-dqminindice[j].front()>=l2)
{
dqmin[j].pop_front();
dqminindice[j].pop_front();
}
while (!dqmax[j].empty() && i-dqmaxindice[j].front()>=l2)
{
dqmax[j].pop_front();
dqmaxindice[j].pop_front();
}
while (!dqmin[j].empty() && a[i][dq[i].front()]<a[dqminindice[j].back()][dqmin[j].back()])
{
dqmin[j].pop_back();
dqminindice[j].pop_back();
}
while (!dqmax[j].empty() && a[i][dq2[i].front()]>a[dqmaxindice[j].back()][dqmax[j].back()])
{
dqmax[j].pop_back();
dqmaxindice[j].pop_back();
}
dqmin[j].push_back(dq[i].front());
dqminindice[j].push_back(i);
dqmax[j].push_back(dq2[i].front());
dqmaxindice[j].push_back(i);
if (i>=l2)
{
if (a[dqmaxindice[j].front()][dqmax[j].front()]-a[dqminindice[j].front()][dqmin[j].front()]<mi)
{
mi=a[dqmaxindice[j].front()][dqmax[j].front()]-a[dqminindice[j].front()][dqmin[j].front()];
ap=0;
}
if (a[dqmaxindice[j].front()][dqmax[j].front()]-a[dqminindice[j].front()][dqmin[j].front()]==mi)
{
ap++;
}
}
}
}
}
if(l1!=l2)
{
swap(l1,l2);
for (i=1; i<=max(n,m); i++)
{
dq[i].clear();
dq2[i].clear();
dqmin[i].clear();
dqmax[i].clear();
dqminindice[i].clear();
dqmaxindice[i].clear();
}
for (j=1; j<=m; j++)
{
for (i=1; i<=n; i++)
{
while (!dq[i].empty() && j-dq[i].front()>=l1)
dq[i].pop_front();
while (!dq2[i].empty() && j-dq2[i].front()>=l1)
dq2[i].pop_front();
while (!dq[i].empty() && a[i][j]<a[i][dq[i].back()])
dq[i].pop_back();
while (!dq2[i].empty() && a[i][j]>a[i][dq2[i].back()])
dq2[i].pop_back();
dq[i].push_back(j);
dq2[i].push_back(j);
}
if (j>=l1)
{
for (i=1; i<=n; i++)
{
while (!dqmin[j].empty() && i-dqminindice[j].front()>=l2)
{
dqmin[j].pop_front();
dqminindice[j].pop_front();
}
while (!dqmax[j].empty() && i-dqmaxindice[j].front()>=l2)
{
dqmax[j].pop_front();
dqmaxindice[j].pop_front();
}
while (!dqmin[j].empty() && a[i][dq[i].front()]<a[dqminindice[j].back()][dqmin[j].back()])
{
dqmin[j].pop_back();
dqminindice[j].pop_back();
}
while (!dqmax[j].empty() && a[i][dq2[i].front()]>a[dqmaxindice[j].back()][dqmax[j].back()])
{
dqmax[j].pop_back();
dqmaxindice[j].pop_back();
}
dqmin[j].push_back(dq[i].front());
dqminindice[j].push_back(i);
dqmax[j].push_back(dq2[i].front());
dqmaxindice[j].push_back(i);
if (i>=l2)
{
if (a[dqmaxindice[j].front()][dqmax[j].front()]-a[dqminindice[j].front()][dqmin[j].front()]<mi)
{
mi=a[dqmaxindice[j].front()][dqmax[j].front()]-a[dqminindice[j].front()][dqmin[j].front()];
ap=0;
}
if (a[dqmaxindice[j].front()][dqmax[j].front()]-a[dqminindice[j].front()][dqmin[j].front()]==mi)
ap++;
}
}
}
}
}
fout << mi << " " << ap << "\n";
}
}