Cod sursa(job #2065263)
Utilizator | Data | 13 noiembrie 2017 17:36:04 | |
---|---|---|---|
Problema | Struti | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.57 kb |
#include <fstream>
#include <deque>
using namespace std;
ifstream fin ("struti.in");
ofstream fout("struti.out");
int n, m, p, i, j, v[1002][1002], lmin[1002][1002], lmax[1002][1002],k, t, dy, dx,aux,nr;
deque<int> dmin, dmax;
int cmin[1002][1002],cmax[1002][1002],sol,maxi;
int main ()
{
fin>>n>>m>>p;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fin>>v[i][j];
for(t=1;t<=2*p;t++)
{
if(t%2==1)
fin>>dx>>dy;
else
{
aux=dx;
dx=dy;
dy=aux;
if(dx==dy)
{
fout<<maxi<<" "<<sol<<"\n";
continue;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
while(nr>0&&v[i][j]<=v[i][dmin[nr-1]])
{
nr--;
dmin.pop_back();
}
nr++;
dmin.push_back(j);
if(dmin[0]<j-dy+1)
{
dmin.pop_front();
nr--;
}
if(j>=dy)
lmin[i][j]=v[i][dmin[0]];
while(k>0&&v[i][j]>=v[i][dmax[k-1]])
{
k--;
dmax.pop_back();
}
k++;
dmax.push_back(j);
if(dmax[0]<j-dy+1)
{
dmax.pop_front();
k--;
}
if(j>=dy)
lmax[i][j]=v[i][dmax[0]];
}
while(nr>0)
{
nr--;
dmin.pop_front();
}
while(k>0)
{
k--;
dmax.pop_front();
}
}
for(j=dy;j<=m;j++)
{
for(i=1;i<=n;i++)
{
while(nr>0&&lmin[i][j]<=lmin[dmin[nr-1]][j])
{
nr--;
dmin.pop_back();
}
nr++;
dmin.push_back(i);
if(dmin[0]<i-dx+1)
{
dmin.pop_front();
nr--;
}
if(i>=dx)
cmin[i][j]=lmin[dmin[0]][j];
while(k>0&&lmax[i][j]>=lmax[dmax[k-1]][j])
{
k--;
dmax.pop_back();
}
k++;
dmax.push_back(i);
if(dmax[0]<i-dx+1)
{
dmax.pop_front();
k--;
}
if(i>=dx)
cmax[i][j]=lmax[dmax[0]][j];
}
while(nr>0)
{
nr--;
dmin.pop_front();
}
while(k>0)
{
k--;
dmax.pop_front();
}
}
if(t%2==1)
maxi=10000;
for(i=dx;i<=n;i++)
{
for(j=dy;j<=m;j++)
{
if(maxi>cmax[i][j]-cmin[i][j])
{
maxi=cmax[i][j]-cmin[i][j];
sol=1;
}
else
if(maxi==cmax[i][j]-cmin[i][j])
sol++;
}
}
if(t%2==0)
fout<<maxi<<" "<<sol<<"\n";
}
fin.close();
fout.close();
return 0;
}