Cod sursa(job #1293898)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 16 decembrie 2014 18:44:16
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");

 struct vec
 { int x,y; } v[90005];

 int n,m,k,a[305][305],st[20005],dr[20005],x1[20005],yy1[20005],x2[20005],y2[20005],eq[90005],dad[90005];
 int d[90005],kd,use[20005],nums[90005],kn,ord,nr,last[20005];
 int el[305][305];
 vector <int> pos[90005];

  bool comp(vec p1,vec p2)
  { return a[p1.x][p1.y]<a[p2.x][p2.y]; }


 void Norm()
 { int i;
   sort(v+1,v+k+1,comp);
   ord=0;

    for(i=1;i<=k;i++)
    {
      if (a[v[i].x][v[i].y]>a[v[i-1].x][v[i-1].y]) ord++;
      eq[ord]=a[v[i].x][v[i].y];
      a[v[i].x][v[i].y]=ord;

    }
 }

  int Gr(int x)
  { int i,kd=0;

    while(dad[x]!=x)
     { kd++; d[kd]=x;
       x=dad[x];
     }

    for(i=1;i<=kd;i++)
     dad[d[i]]=x;

   return x;
  }

 void Solve(int mnval)
 { int i,j,ind=0;

     memset(dad,0,sizeof(dad));

   for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
     { ind++; dad[ind]=ind;
     if (a[i][j]>=mnval)
      {

        if (a[i-1][j]>=mnval) dad[el[i-1][j]]=ind;
        if (a[i][j-1]>=mnval) dad[el[i][j-1]]=ind;
      }
     dad[el[i][j]]=ind;

     }
 }

int main()
{ int i,j,p,mid,stp;

   f>>n>>m;

   for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    { f>>a[i][j];
      k++; v[k].x=i; v[k].y=j;
      el[i][j]=(i-1)*n+j;
    }

   Norm();

    for(i=1;i<=m;i++)
    { f>>x1[i]>>yy1[i]>>x2[i]>>y2[i];
      st[i]=1; dr[i]=ord;
    }

  for(;;)
   {

     stp=1; kn=0;

      memset(use,0,sizeof(use));

    for(i=1;i<=m;i++)
    {
      if (st[i]<=dr[i])
       { mid=(st[i]+dr[i])/2;
          stp=0;
        if (!use[mid]) {kn++; nums[kn]=mid; use[mid]=1;}
          pos[mid].push_back(i);
       }
    }

  for(i=1;i<=kn;i++)
    { nr=nums[i];
      Solve(nr);

      for(j=0;j<pos[nr].size();j++)
       { p=pos[nr][j];
         if (  Gr(el[x1[p]][yy1[p]])  == Gr(el[x2[p]][y2[p]])   )
          {st[p]=((st[p]+dr[p])/2)+1;
           last[p]=1;
          }
           else
          {dr[p]=((st[p]+dr[p])/2)-1;
           last[p]=0;
          }
       }

      while(pos[nr].size())
       pos[nr].pop_back();
    }




    if (stp) break;
   }

  for(i=1;i<=m;i++)
   g<<eq[dr[i]]<<"\n";

     return 0;
}