Cod sursa(job #2591653)

Utilizator sarthak_jain_1Sarthak Jain sarthak_jain_1 Data 30 martie 2020 21:45:30
Problema Matrice 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
/*
 Sarthak Jain
*/
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long

int mod=1e9+7;
int min(int a,int b){
  return (a<b)?a:b;
}
int max(int a,int b){
  return (a>b)?a:b;
}
int fp(int a,int b){
  if(b==0) return 1;
  int x=fp(a,b/2);
  x=(x*x)%mod;
  if(b&1) x=(x*a)%mod;
  return x;
}
int n;
int node(int i,int j)
{
  return (i-1)*n+j;
}
vector<vector<int>> ar,query;
vector<int> ans,par;
vector<set<int>> st;

int find(int a)
{
  if(par[a]==a)
    return a;
  return par[a]=find(par[a]);
}

void  addedge(int val,int a1,int b1)
{
   int a=find(a1);
   int b=find(b1);
   if(st[a].size()<st[b].size())
    swap(a,b);

   if(a==b)
    return ;
   vector<int> temp;
   for(auto i:st[b])
   {
    auto it=st[a].find(i);
    if(it==st[a].end())
    { 
       temp.push_back(i);
    }
    else
    {
       query[i][4]=val;
    }
   }
   
   for(auto i:st[a])
   {
    auto it=st[b].find(i);
    if(it==st[a].end())
    { 
       temp.push_back(i);
    }
    else
    {
       query[i][4]=val;
    }
   }
   st[a].clear();
   for(auto i:temp)
    st[a].insert(i);
   par[b]=a;
   st[b].clear();

}

signed main() {
ifstream in("matrix2.in");
ofstream out("matrix2.out");
  
 ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
 
 int q;
 in>>n>>q;
 ans=vector<int>(n*n+1);
 ar=vector<vector<int>>(n*n+1);
 par=vector<int>(n*n+1);
 st=vector<set<int>>(n*n+1);

 for(int i=1;i<=n*n;i++)
   par[i]=i;

 query=vector<vector<int>>(q+1,vector<int>(5));
 int v[n+1][n+1];

 for(int i=1;i<=n;i++)
 {
  for(int j=1;j<=n;j++)
  {
    in>>v[i][j];
  }
 }
 int nx,ny;
 vector<array<int,3>> edges;
 int dx[]={1,-1,0,0};
 int dy[]={0,0,1,-1};

 for(int i=1;i<=n;i++)
 {
  for(int j=1;j<=n;j++)
  {
      for(int k=0;k<4;k++)
      {
        nx=i+dx[k];
        ny=j+dy[k];
        if(nx<1||ny<1||nx>n||ny>n)
          continue;

      //  cout<<i<<" "<<j<<" "<<nx<<" "<<ny<<endl;
        edges.push_back({min(v[i][j],v[nx][ny]),node(i,j),node(nx,ny)});

      }
  }
 }

 sort(edges.begin(),edges.end());
 reverse(edges.begin(),edges.end());

 // for(auto i:edges)
 //  cout<<i[0]<<endl;


 for(int i=1;i<=q;i++)
 {
  in>>query[i][0]>>query[i][1]>>query[i][2]>>query[i][3];
  st[node(query[i][0],query[i][1])].insert(i);
  st[node(query[i][2],query[i][3])].insert(i);
 }
  
 for(auto i:edges)
 {
  addedge(i[0],i[1],i[2]);
 } 

 for(int i=1;i<=q;i++){
  //query[i][4]=0;
  out<<query[i][4]<<endl;
  
}
in.close();
out.close();

}