Advertisement
Guest User

Untitled

a guest
Feb 20th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. //g++ filename.cpp -std=c++14 -DH
  2. #ifdef H
  3. #include "/Users/michaelw/stdc++.h"
  4. #else
  5. #include <bits/stdc++.h>
  6. #endif
  7.  
  8. using namespace std;
  9.  
  10. #define endl '\n'
  11. #define pb push_back
  12. #define f first
  13. #define s second
  14. #define lb lower_bound
  15. #define ub upper_bound
  16. #define all(x) x.begin(), x.end()
  17. #define MOD 1000000007
  18. #define pq priority_queue
  19.  
  20. typedef long long ll;
  21. typedef pair<int, string> pis;
  22. typedef pair<int,int> pii;
  23.  
  24. struct Qu {
  25.     int w;
  26.     int vid;
  27.     int index;
  28.  
  29. };
  30.  
  31. struct Edge {
  32.     int relev;
  33.     int pp;
  34.     int qq;
  35. };
  36.  
  37. vector<Qu> queries;
  38. vector<Edge> edges;
  39.  
  40.  
  41. map<int, int> parent;
  42. vector<int> order, CC;
  43. int findSet(int x){
  44.     if(x != parent[x]) parent[x] = findSet(parent[x]);
  45.     return parent[x];
  46. }
  47. void mergeSet(int x, int y){
  48.     int rootX = findSet(x);
  49.     int rootY = findSet(y);
  50.     // cout << order[rootX] << " " <<   << "  " << order[rootY] << " " << rootY << endl;
  51.     if(order[rootX] > order[rootY]){
  52.         CC[rootX] += CC[rootY];
  53.         parent[rootY] = rootX;
  54.     }
  55.     else{
  56.         CC[rootY] += CC[rootX];
  57.         parent[rootX] = rootY;
  58.     }  
  59.     if(order[rootX] == order[rootY]) order[rootY]++;
  60.  
  61. }
  62. //set tab size to 3
  63. int main(){
  64.     //codeforces cin
  65.     ios_base::sync_with_stdio(false);
  66.     cin.tie(nullptr);
  67.     ifstream fin("mootube.in");
  68.     ofstream fout("mootube.out");
  69.     int N, Q;
  70.     fin >> N >> Q;
  71.     queries.resize(Q);
  72.     order.resize(N+1);
  73.     CC.resize(N+1, 1);
  74.     parent[N] = N;
  75.     for(int i = 0; i < N-1; i++){
  76.         parent[i+1] = i+1;
  77.         int p, q, r;
  78.         fin >> p >> q >> r;
  79.         Edge E;
  80.         E.pp = p;
  81.         E.qq = q;
  82.         E.relev = r;
  83.         edges.push_back(E);
  84.     }
  85.     for(int i = 0; i < Q; i++){
  86.         int k, v;
  87.         fin >> k >> v;
  88.         queries[i].w = k;
  89.         queries[i].vid = v;
  90.         queries[i].index = i;
  91.         // cout << k << " " << v << " " << i << endl;
  92.     }
  93.     //sorting the queries to fill in the graph bit by bit
  94.     sort(edges.begin(), edges.end(), [](const Edge& a, const Edge& b) {
  95.         return a.relev > b.relev;
  96.     });
  97.     sort(queries.begin(), queries.end(), [](const Qu& a, const Qu& b) {
  98.         return a.w > b.w;
  99.     });
  100.     vector<int> res (Q);
  101.     int j = 0;
  102.     for(int i = 0; i < queries.size(); i++){
  103.         while(j < edges.size() && edges[j].relev >= queries[i].w){
  104.                 mergeSet(edges[j].pp, edges[j].qq);
  105.                 j++;
  106.         }
  107.         res[queries[i].index] = CC[findSet(queries[i].vid)]-1;
  108.  
  109.     }
  110.     for(auto a: res){
  111.         fout << a << endl;
  112.     }
  113.  
  114.    
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement