Advertisement
Jaydeep999997

Evil Chris Solution

Oct 8th, 2020
710
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 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=2e5+5;
  9.  
  10. int n,m,D,S;
  11. int l[N],r[N],c[N],s[N],t[N],k[N],par[N],sum[N];
  12. pair<int,pair<int,int>> a[N];
  13. vector<int> mid[N];
  14. set<pair<int,int>> ms;
  15.  
  16. int get_par(int x)
  17. {
  18.     while(x!=par[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.     par[p2]=p1;
  35.     sum[p1]+=sum[p2];
  36.     sum[p2]=0;
  37. }
  38.  
  39. void reset()
  40. {
  41.     for(int i=1;i<=n;i++)
  42.     {
  43.         par[i]=i;
  44.         sum[i]=c[i];
  45.     }
  46.     for(auto &x:ms)
  47.     {
  48.         merge(x.ff,x.ss);
  49.     }
  50. }
  51.  
  52. void apply(int id)
  53. {
  54.     if(id==0)
  55.     {
  56.         return;
  57.     }
  58.     if(a[id].ff==1)
  59.     {
  60.         merge(a[id].ss.ff,a[id].ss.ss);
  61.     }
  62.     else
  63.     {
  64.         sum[get_par(a[id].ss.ff)]+=a[id].ss.ss;
  65.     }
  66. }
  67.  
  68.  
  69. signed main()
  70. {
  71.     ios_base::sync_with_stdio(false);
  72.     cin.tie(NULL);  cout.tie(NULL);
  73.  
  74.     cin>>n>>m>>D>>S;
  75.  
  76.     for(int i=1;i<=n;i++)
  77.     {
  78.         cin>>c[i];
  79.     }
  80.  
  81.     for(int i=1;i<=m;i++)
  82.     {
  83.         int u,v;
  84.         cin>>u>>v;
  85.         if(u>v)
  86.         {
  87.             swap(u,v);
  88.         }
  89.         ms.insert({u,v});
  90.     }
  91.  
  92.     for(int i=1;i<=D;i++)
  93.     {
  94.         cin>>a[i].ff>>a[i].ss.ff>>a[i].ss.ss;
  95.         if(a[i].ff==1)
  96.         {
  97.             if(a[i].ss.ff>a[i].ss.ss)
  98.             {
  99.                 swap(a[i].ss.ff,a[i].ss.ss);
  100.             }
  101.             ms.erase({a[i].ss.ff,a[i].ss.ss});
  102.         }
  103.         else
  104.         {
  105.             c[a[i].ss.ff]-=a[i].ss.ss;
  106.         }
  107.     }
  108.  
  109.     reverse(a+1,a+D+1);
  110.  
  111.     for(int i=1;i<=S;i++)
  112.     {
  113.         cin>>s[i]>>t[i]>>k[i];
  114.         l[i]=0;
  115.         r[i]=D+1;
  116.     }
  117.  
  118.     bool done=0;
  119.     while(!done)
  120.     {
  121.         done=1;
  122.         reset();
  123.  
  124.         for(int i=1;i<=S;i++)
  125.         {
  126.             if(l[i]!=r[i])
  127.             {
  128.                 done=0;
  129.                 int c_mid=(l[i]+r[i])>>1;
  130.                 mid[c_mid].push_back(i);
  131.             }
  132.         }
  133.  
  134.         for(int i=0;i<=D;i++)
  135.         {
  136.             apply(i);
  137.             while(!mid[i].empty())
  138.             {
  139.                 int id=mid[i].back();
  140.                 mid[i].pop_back();
  141.                 int p1=get_par(s[id]);
  142.                 int p2=get_par(t[id]);
  143.                 int have=sum[p1]+sum[p2];
  144.                 if(have>=k[id])
  145.                 {
  146.                     r[id]=i;
  147.                 }
  148.                 else
  149.                 {
  150.                     l[id]=i+1;
  151.                 }
  152.             }
  153.         }
  154.     }
  155.  
  156.     for(int i=1;i<=S;i++)
  157.     {
  158.         assert(l[i]==r[i]);
  159.         if(r[i]<=D)
  160.         {
  161.             cout<<D-r[i]<<endl;
  162.         }
  163.         else
  164.         {
  165.             cout<<-1<<endl;
  166.         }
  167.     }
  168.  
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement