Cod sursa(job #1293954)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 16 decembrie 2014 20:06:21
Problema Matrice 2 Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstdlib>
#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],el[305][305],act;

 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,initx=x;

    while(dad[x]!=x)
     { kd++; d[kd]=x;
  // if (initx==5) {cout<<dad[el[1][5]]; system("pause");}
       x=dad[x];
     }

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

   return x;
  }

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



    for(i=act;i>0;i--)
     { ind=el[v[i].x][v[i].y];

          // cout<<v[i].x<<" "<<v[i].y<<"\n";

     if (a[v[i].x][v[i].y]>=mnval)
      {

        if (a[v[i].x-1][v[i].y]>=mnval) dad[Gr(el[v[i].x-1][v[i].y])]=Gr(ind);

        if (a[v[i].x][v[i].y-1]>=mnval) dad[Gr(el[v[i].x][v[i].y-1])]=Gr(ind);

        if (a[v[i].x+1][v[i].y]>=mnval) dad[Gr(el[v[i].x+1][v[i].y])]=Gr(ind);
        if (a[v[i].x][v[i].y+1]>=mnval) dad[Gr(el[v[i].x][v[i].y+1])]=Gr(ind);

      }
    else break;

     }

  act=i;

 }

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; act=k;

      memset(use,0,sizeof(use));
      memset(dad,0,sizeof(dad));
        for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
          dad[el[i][j]]=el[i][j];

    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);
       }
    }

    sort(nums+1,nums+kn+1,greater<int>());

  for(i=1;i<=kn;i++)
    { nr=nums[i];
        //cout<<nums[i]<<" ";
      Solve(nr);
       // cout<<act;
      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;
}