Advertisement
Jaydeep999997

Travel in Hackerland

Oct 8th, 2020
796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ff first
  5. #define ss second
  6. #define endl '\n'
  7.  
  8. const int N=1e5+5;
  9.  
  10. int n,m,q;
  11. int par[N],T[N],x[N],y[N],k[N],l[N],r[N];
  12. vector<int> mid[N];
  13. set<int> ms[N];
  14. pair<int,pair<int,int>> a[N];
  15.  
  16. int get_par(int x)
  17. {
  18.     while(par[x]!=x)
  19.     {
  20.         par[x]=par[par[x]];
  21.         x=par[x];
  22.     }
  23.     return x;
  24. }
  25.  
  26. void merge(int u,int v)
  27. {
  28.     int p1=get_par(u);
  29.     int p2=get_par(v);
  30.     if(p1==p2)
  31.     {
  32.         return;
  33.     }
  34.     if(ms[p1].size() < ms[p2].size())
  35.     {
  36.         swap(p1,p2);
  37.     }
  38.     for(auto &x:ms[p2])
  39.     {
  40.         ms[p1].insert(x);
  41.     }
  42.     ms[p2].clear();
  43.     par[p2]=p1;
  44. }
  45.  
  46. void reset()
  47. {
  48.     for(int i=1;i<=n;i++)
  49.     {
  50.         par[i]=i;
  51.         ms[i].clear();
  52.         ms[i].insert(T[i]);
  53.     }
  54. }
  55.  
  56. void apply(int id)
  57. {
  58.     merge(a[id].ss.ff,a[id].ss.ss);
  59. }
  60.  
  61. signed main()
  62. {
  63.     ios_base::sync_with_stdio(false);
  64.     cin.tie(NULL);  cout.tie(NULL);
  65.  
  66.     cin>>n>>m>>q;
  67.  
  68.     for(int i=1;i<=n;i++)
  69.     {
  70.         cin>>T[i];
  71.     }
  72.  
  73.     for(int i=1;i<=m;i++)
  74.     {
  75.         cin>>a[i].ss.ff>>a[i].ss.ss>>a[i].ff;
  76.     }
  77.     sort(a+1,a+m+1);
  78.  
  79.     for(int i=1;i<=q;i++)
  80.     {
  81.         cin>>x[i]>>y[i]>>k[i];
  82.         l[i]=1;
  83.         r[i]=m+1;
  84.     }
  85.  
  86.     bool done=0;
  87.     while(!done)
  88.     {
  89.         done=1;
  90.         reset();
  91.         for(int i=1;i<=q;i++)
  92.         {
  93.             if(l[i]!=r[i])
  94.             {
  95.                 done=0;
  96.                 int c_mid=(l[i]+r[i])>>1;
  97.                 mid[c_mid].push_back(i);
  98.             }
  99.         }
  100.         for(int i=1;i<=m;i++)
  101.         {
  102.             apply(i);
  103.             while(!mid[i].empty())
  104.             {
  105.                 int id=mid[i].back();
  106.                 mid[i].pop_back();
  107.                 int p1=get_par(x[id]);
  108.                 int p2=get_par(y[id]);
  109.                 if(p1==p2 and (int)ms[p1].size()>=k[id])  // must be connected
  110.                 {
  111.                     r[id]=i;
  112.                 }
  113.                 else
  114.                 {
  115.                     l[id]=i+1;
  116.                 }
  117.             }
  118.         }
  119.     }
  120.  
  121.     for(int i=1;i<=q;i++)
  122.     {
  123.         assert(l[i]==r[i]);
  124.         if(r[i]<=m)
  125.         {
  126.             cout<<a[r[i]].ff<<endl;
  127.         }
  128.         else
  129.         {
  130.             cout<<-1<<endl;
  131.         }
  132.     }
  133. }
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement