Cod sursa(job #967852)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 28 iunie 2013 16:53:58
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,p,a[1005][1005],mn[1005][1005],mx[1005][1005],q[1005],sol1[1005][1005],sol2[1005][1005],maxx,ap=0;
void Read();
void Solve(int x,int y);
void Read()
{ int i,j,dim1,dim2;
 f>>n>>m>>p;
   for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
    f>>a[i][j];
 for(i=1;i<=p;i++)
 { f>>dim1>>dim2;
    maxx=2147000000; ap=0;
    Solve(dim1,dim2);
    if (dim1!=dim2) Solve(dim2,dim1);
    g<<maxx<<" "<<ap<<"\n";
 }
}
void Solve(int x,int y)
{ int i,j,st=1,dr=0;

  for(j=1;j<=m;j++)
  { st=1;dr=0; //memset(q,0,sizeof(q));
   for(i=1;i<=n;i++)
   { while(st<=dr && a[i][j]<a[q[dr]][j]) dr--;
     dr++; q[dr]=i;
      while(q[st]<=i-x) st++;

     mn[i][j]=a[q[st]][j];
   }
  }

  for(j=1;j<=m;j++)
  { st=1;dr=0; //memset(q,0,sizeof(q));
   for(i=1;i<=n;i++)
   { while(st<=dr && a[i][j]>a[q[dr]][j]) dr--;
     dr++; q[dr]=i;
      while(q[st]<=i-x) st++;
     mx[i][j]=a[q[st]][j];
   }
  }

 for(i=x;i<=n;i++)
  { st=1;dr=0; memset(q,0,sizeof(q));
    for(j=1;j<=m;j++)
     {while(st<=dr && mn[i][j]<mn[i][q[dr]]) dr--;
     dr++; q[dr]=j;
      while(q[st]<=j-y) st++;
     sol1[i][j]=mn[i][q[st]];
     }
  }

 for(i=x;i<=n;i++)
  { st=1;dr=0; memset(q,0,sizeof(q));
    for(j=1;j<=m;j++)
     {while(st<=dr && mx[i][j]>mx[i][q[dr]]) dr--;
     dr++; q[dr]=j;
      while(q[st]<=j-y) st++;
     sol2[i][j]=mx[i][q[st]];
     }
  }

 /*for(i=1;i<=n;i++)
 { for(j=1;j<=m;j++)
   cout<<sol1[i][j]<<" ";
     cout<<"\n";
 }
 cout<<"\n";
 for(i=1;i<=n;i++)
 { for(j=1;j<=m;j++)
   cout<<sol1[i][j]<<" ";
     cout<<"\n";
 }*/
  for(i=x;i<=n;i++)
  for(j=y;j<=m;j++)
  if (sol2[i][j]-sol1[i][j]<maxx) {maxx=sol2[i][j]-sol1[i][j]; ap=1;}
  else if (sol2[i][j]-sol1[i][j]==maxx) ap++;
}
int main()
{ Read();
    return 0;
}