Jaydeep999997

Stamp Rally

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