Pagini recente » Cod sursa (job #739637) | Cod sursa (job #2106492) | Cod sursa (job #1661858) | Cod sursa (job #105878) | Cod sursa (job #1992287)
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int elem[1005][1005],n,m,p,a,b,ch;
int mn[1005][1005],mx[1005][1005],nr,rez;
deque<int> posmn,posmx;
string s;
int nextint()
{
int nr=0;
while(s[ch]>='0' && s[ch]<='9')
{
nr=nr*10+s[ch]-'0';
++ch;
}
++ch;
return nr;
}
int main()
{
f>>n>>m>>p; getline(f,s);
for(int i=1;i<=n;++i)
{
getline(f,s);
ch=0;
for(int j=1;j<=m;++j)
{
elem[i][j]=nextint();
}
}
for(int z=1;z<=p;++z)
{
f>>a>>b;
nr=0;
rez=10000;
for(int h=1;h<=2;++h)
{
///minim si maxim de lungime b
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
//incadrare in limite
if(!posmn.empty() && j-posmn.front()>=b) posmn.pop_front();
if(!posmx.empty() && j-posmx.front()>=b) posmx.pop_front();
//element minim/maxim
while(!posmn.empty() && elem[i][j]<=elem[i][posmn.back()]) posmn.pop_back();
while(!posmx.empty() && elem[i][j]>=elem[i][posmx.back()]) posmx.pop_back();
//adaguare element
posmx.push_back(j);
posmn.push_back(j);
//adaugare in matrice
if(j>=b)
{
mn[i][j-b+1]=elem[i][posmn.front()];
mx[i][j-b+1]=elem[i][posmx.front()];
}
}
//golire
while(!posmn.empty()) posmn.pop_back();
while(!posmx.empty()) posmx.pop_back();
}
///secventa de lungime a optima
for(int j=1;j<=m-b+1;++j)
{
for(int i=1;i<=n;++i)
{
//incadrare in limite
if(!posmn.empty() && i-posmn.front()>=a) posmn.pop_front();
if(!posmx.empty() && i-posmx.front()>=a) posmx.pop_front();
//element maxim/minin
while(!posmn.empty() && mn[i][j]<=mn[posmn.front()][j]) posmn.pop_back();
while(!posmx.empty() && mx[i][j]>=mx[posmx.front()][j]) posmx.pop_back();
//adaugare element
posmx.push_back(i);
posmn.push_back(i);
//rezultat minim
if(i>=a)
{
if(mx[posmx.front()][j]-mn[posmn.front()][j]<rez)
{
rez=mx[posmx.front()][j]-mn[posmn.front()][j];
nr=1;
}
else if(mx[posmx.front()][j]-mn[posmn.front()][j]==rez)
{
++nr;
}
}
}
//golire
while(!posmn.empty()) posmn.pop_back();
while(!posmx.empty()) posmx.pop_back();
}
if(a!=b) swap(a,b);
else break;
}
g<<rez<<' '<<nr<<'\n';
}
return 0;
}