Cod sursa(job #2067426)
Utilizator | Data | 16 noiembrie 2017 13:32:05 | |
---|---|---|---|
Problema | Struti | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 4.06 kb |
#include <cstdio>
#include <deque>
#define DIMBUFF 100000
using namespace std;
FILE * fin = fopen ("struti.in", "r");
FILE *fout = fopen ("struti.out", "w");
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,cmax,sol,maxi;
char buff[DIMBUFF];
int pp;
int numar() {
int val = 0;
while (!(buff[pp] >= '0' && buff[pp] <= '9')) {
pp++;
if (pp == DIMBUFF) {
fread(buff, 1, DIMBUFF, fin);
pp=0;
}
}
while (buff[pp] >= '0' && buff[pp] <= '9') {
val = val*10 + buff[pp] - '0';
pp++;
if (pp == DIMBUFF) {
fread(buff, 1, DIMBUFF, fin);
pp=0;
}
}
return val;
}
int main ()
{
fread(buff, 1, DIMBUFF, fin);
n=numar();
m=numar();
p=numar();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
v[i][j]=numar();
for(t=1;t<=2*p;t++)
{
if(t%2==1)
{
dx=numar();
dy=numar();
}
else
{
aux=dx;
dx=dy;
dy=aux;
if(dx==dy)
{
fprintf (fout,"%d %d\n",maxi,sol);
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();
}
}
if(t%2==1)
maxi=10000;
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=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=lmax[dmax[0]][j];
if(maxi>cmax-cmin)
{
maxi=cmax-cmin;
sol=1;
}
else
if(maxi==cmax-cmin)
sol++;
}
}
while(nr>0)
{
nr--;
dmin.pop_front();
}
while(k>0)
{
k--;
dmax.pop_front();
}
}
if(t%2==0)
fprintf (fout,"%d %d\n",maxi,sol);
}
return 0;
}