Cod sursa(job #251119)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 1 februarie 2009 22:04:31
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<stdio.h>
#include<string.h>
FILE*fin=fopen("struti.in","r");
FILE*fout=fopen("struti.out","w");
#define nm 1002
#define inf 10000
#define si short int
si a[nm][nm],deql[nm][nm],deqh[nm][nm],indl[nm][nm],indh[nm][nm];
si dl[nm],dh[nm],il[nm],ih[nm],stl[nm],sth[nm],drl[nm],drh[nm];
si n,m,p;
int ans,nr;
// hl==1->max deque
// hl==0->min deque
void ins(si wh[],si wi[],si &st,si &dr,si ind,si elem,si hl)
{
  if(hl) while(elem>wh[dr]&&dr>=st) dr--;
  else while(elem<wh[dr]&&dr>=st) dr--;
  dr++;
  wh[dr]=elem;
  wi[dr]=ind;

}
void solve(si lines,si columns)
{
  si j,i,frontl,fronth,backl,backh;
  for(j=1;j<=m;j++)
  {
    stl[j]=1;
    drl[j]=0;
    sth[j]=1;
    drh[j]=0;
    for(i=1;i<lines;i++)
    {
      ins(deql[j],indl[j],stl[j],drl[j],i,a[i][j],0);
      ins(deqh[j],indh[j],sth[j],drh[j],i,a[i][j],1);
    }
  }
  for(i=lines;i<=n;i++)
  {
    for(j=1;j<=m;j++)
    {
      ins(deql[j],indl[j],stl[j],drl[j],i,a[i][j],0);
      ins(deqh[j],indh[j],sth[j],drh[j],i,a[i][j],1);
      if(indl[j][stl[j]]<=i-lines) stl[j]++;
      if(indh[j][sth[j]]<=i-lines) sth[j]++;
    }
    frontl=1;backl=0;
    fronth=1;backh=0;
    for(j=1;j<=m;j++)
    {
      ins(dl,il,frontl,backl,j,deql[j][stl[j]],0);
      ins(dh,ih,fronth,backh,j,deqh[j][sth[j]],1);
      if(il[frontl]<=j-columns) frontl++;
      if(ih[fronth]<=j-columns) fronth++;
      if(j>=columns) if(ans>dh[fronth]-dl[frontl])
		     {
		       ans=dh[fronth]-dl[frontl];
		       nr=1;
		     }
		     else if(ans==dh[fronth]-dl[frontl]) nr++;
    }
  }
}
int main()
{
  si i,j,dx,dy;
  fscanf(fin,"%hd%hd%hd",&n,&m,&p);
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
      fscanf(fin,"%hd",&a[i][j]);
  for(i=1;i<=p;i++)
  {
    fscanf(fin,"%hd%hd",&dx,&dy);
    ans=inf;
    nr=0;
    if(dx<=n&&dy<=m) solve(dx,dy);
    if(dx!=dy) if(dy<=n&&dx<=m) solve(dy,dx);
    fprintf(fout,"%d %d\n",ans,nr);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}