Advertisement
despotovski01

Connected Components

Jun 1st, 2017
78
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. typedef long long ll;
  4. typedef pair<int, int> pt;
  5. typedef pair<pt, int> query;
  6.  
  7. const int MAX_N = 510;
  8. const int MAX_Q = 100000;
  9.  
  10. bool cmp(const query& a, const query& b){
  11.     int al = a.first.first;
  12.     int bl = b.first.first;
  13.     int ar = a.first.second;
  14.     int br = b.first.second;
  15.     if(al < bl){
  16.         return true;
  17.     } else if(al > bl){
  18.         return false;
  19.     }
  20.     if(ar > br){
  21.         return true;
  22.     } else if(ar < br){
  23.         return false;
  24.     }
  25.     return a.second < b.second;
  26. }
  27.  
  28. vector<pt> edges;
  29. query queries[MAX_Q];
  30. int ans[MAX_Q];
  31. int comp[MAX_N];
  32. int sz[MAX_N];
  33.  
  34. int components = 0;
  35.  
  36. inline int ufind(int v){
  37.     if(comp[v] == v){
  38.         return v;
  39.     }
  40.     return comp[v] = ufind(comp[v]);
  41. }
  42.  
  43. inline bool umerge(int u, int v){
  44.     int cu = ufind(u);
  45.     int cv = ufind(v);
  46.     if(cu == cv){
  47.         return false;
  48.     }
  49.     if(sz[cu] > sz[cv]){
  50.         comp[cv] = cu;
  51.         sz[cu] += sz[cv];
  52.     } else {
  53.         comp[cu] = cv;
  54.         sz[cv] += sz[cu];
  55.     }
  56.     return true;
  57. }
  58.  
  59. inline void addEdge(int idx){
  60.     if(umerge(edges[idx].first, edges[idx].second)){
  61.         components--;
  62.     }
  63. }
  64.  
  65. inline void init(int n){
  66.     for(int i = 0;i<n;++i){
  67.         comp[i] = i;
  68.         sz[i] = 1;
  69.     }
  70.     components = n;
  71. }
  72.  
  73. int main(){
  74.     ios::sync_with_stdio(false);
  75.     int n, m;
  76.     cin>>n>>m;
  77.     for(int i = 0;i<m;++i){
  78.         int x, y;
  79.         cin>>x>>y;
  80.         x--;y--;
  81.         edges.push_back({x, y});
  82.     }
  83.     int k;
  84.     cin>>k;
  85.     for(int i = 0;i<k;++i){
  86.         int l, r;
  87.         cin>>l>>r;
  88.         l--;r--;
  89.         queries[i] = {{l, r}, i};
  90.     }
  91.     sort(queries, queries+k, cmp);
  92.     int left = -1, right = m-1;
  93.     init(n);
  94.     for(int i = 0;i<k;++i){
  95.         int l = queries[i].first.first;
  96.         int r = queries[i].first.second;
  97.         if(l != left){
  98.             init(n);
  99.             left = 0;
  100.             right = m-1;
  101.             while(left < l){
  102.                 addEdge(left);
  103.                 left++;
  104.             }
  105.         }
  106.         while(right > r){
  107.             addEdge(right);
  108.             right--;
  109.         }
  110.         ans[queries[i].second] = components;
  111.     }
  112.  
  113.     for(int i = 0;i<k;++i){
  114.         cout<<ans[i]<<endl;
  115.     }
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement