Cod sursa(job #334324)

Utilizator mlazariLazari Mihai mlazari Data 26 iulie 2009 11:13:34
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<stdio.h>

#define NMAX 1003

int i,j,m,n,p,dx,dy,difmin,nter;
int a[NMAX][NMAX],pmin[NMAX][NMAX],pmax[NMAX][NMAX];
int dlmin[NMAX],dlmax[NMAX],dcmin[NMAX][NMAX],dcmax[NMAX][NMAX];
int plmin,ulmin,plmax,ulmax,pcmin[NMAX],ucmin[NMAX],pcmax[NMAX],ucmax[NMAX];

void oferta(int x,int y) {
  int dif,pr,minp,maxp;
  for(i=0;i<n;i++) {
    pcmin[i]=pcmax[i]=1;
    ucmin[i]=ucmax[i]=0;
  }
  for(i=0;i<m;i++) {
    plmin=plmax=1;
    ulmin=ulmax=0;
    for(j=0;j<n;j++) {

      // lmin
      while((ulmin>=plmin)&&(a[i][dlmin[ulmin]]>=a[i][j])) ulmin--;
      dlmin[++ulmin]=j;
      if(j-dlmin[plmin]+1>x) plmin++;
      minp=pmin[i][j]=dlmin[plmin];

      // lmax
      while((ulmax>=plmax)&&(a[i][dlmax[ulmax]]<=a[i][j])) ulmax--;
      dlmax[++ulmax]=j;
      if(j-dlmax[plmax]+1>x) plmax++;
      maxp=pmax[i][j]=dlmax[plmax];

      // cmin
      pr=pcmin[j];
      while((ucmin[j]>=pr)&&(a[dcmin[j][ucmin[j]]][pmin[dcmin[j][ucmin[j]]][j]]>=a[i][minp]))
       ucmin[j]--;
      dcmin[j][++ucmin[j]]=i;
      if(i-dcmin[j][pcmin[j]]+1>y) pcmin[j]++;

      // cmax
      pr=pcmax[j];
      while((ucmax[j]>=pr)&&(a[dcmax[j][ucmax[j]]][pmax[dcmax[j][ucmax[j]]][j]]<=a[i][maxp]))
       ucmax[j]--;
      dcmax[j][++ucmax[j]]=i;
      if(i-dcmax[j][pcmax[j]]+1>y) pcmax[j]++;

      if((i>=y-1)&&(j>=x-1)) {
        dif=a[dcmax[j][pcmax[j]]][pmax[dcmax[j][pcmax[j]]][j]]-a[dcmin[j][pcmin[j]]][pmin[dcmin[j][pcmin[j]]][j]];
        if(dif<difmin) {
          difmin=dif;
          nter=1;
        }
        else
         if(dif==difmin) nter++;
      }
    }
  }
}

int main() {
  char s[5003];
  int id;
  freopen("struti.in","r",stdin);
  freopen("struti.out","w",stdout);
  scanf("%d %d %d\n",&m,&n,&p);
  for(i=0;i<m;i++) {
    fgets(s,5003,stdin);
    id=0;
    for(j=0;j<n;j++) {
       a[i][j]=0;
       while((s[id]>='0')&&(s[id]<='9')) a[i][j]=a[i][j]*10+s[id++]-'0';
       id++;
    }
  }
  for(;p--;) {
    scanf("%d %d",&dx,&dy);
    difmin=10000;
    oferta(dx,dy);
    if(dx!=dy) oferta(dy,dx);
    printf("%d %d\n",difmin,nter+1);
  }
}