Cod sursa(job #1738360)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 6 august 2016 16:11:43
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include<bits/stdc++.h>
using namespace std;
deque<int> q,q1;
int minim=10000,n,m,p,a[1005][1005],m1[1005][1005],m2[1005][1005],x=0,y=0,nr,dx,dy;
void solve(int l,int L)
{
    for(int i=1;i<=n;i++)
        {
            while (!q.empty()) q.pop_front();
            for(int j=1;j<=m;j++)
            {
               while (!q.empty() && a[i][q.back()]>=a[i][j])
               {
                   q.pop_back();
               }
               q.push_back(j);
               while (q.front()<=(j-L)) q.pop_front();
               if (j>=L)
               {
                   m1[i][j]=q.front();
               }
            }
              while (!q.empty()) q.pop_front();
            for(int j=1;j<=m;j++)
            {
               while (!q.empty() && a[i][q.back()]<=a[i][j])
               {
                   q.pop_back();
               }
               q.push_back(j);
                while (q.front()<=(j-L)) q.pop_front();
               if (j>=L)
               {
                   m2[i][j]=q.front();
               }
            }
        }
    for(int j=L;j<=m;j++)
    {
          while (!q.empty()) q.pop_front();
           while (!q1.empty()) q1.pop_front();
          for(int i=1;i<=n;i++)
          {
              while (!q.empty() && a[q.back()][m1[q.back()][j]]>=a[i][m1[i][j]])
              {
                  q.pop_back();
              }
              q.push_back(i);
              if (q.front()<=(i-l)) q.pop_front();
              if (i>=l) x=a[q.front()][m1[q.front()][j]];
              //
              while (!q1.empty() && a[q1.back()][m2[q1.back()][j]]<=a[i][m2[i][j]])
              {
                  q1.pop_back();
              }
              q1.push_back(i);
              if (q1.front()<=(i-l)) q1.pop_front();
              if (i>=l) y=a[q1.front()][m2[q1.front()][j]];
              //
             if (i>=l)
             {
                 if ((y-x)<minim) minim=y-x,nr=1;
                    else
                if((y-x)==minim) nr++;
             }
          }
    }
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(int t=1;t<=p;t++)
    {
        minim=10000;
        nr=0;
        scanf("%d%d",&dx,&dy);
        solve(dx,dy);
        if (dx!=dy) solve(dy,dx);
        printf("%d %d\n",minim,nr);
    }
    return 0;
}