Advertisement
Guest User

Untitled

a guest
Jul 26th, 2013
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <stack>
  5. #include <queue>
  6. #include <algorithm>
  7. #include <ctime>
  8. using namespace std;
  9.  
  10. const int MAXN = 1111111, MAXQ = 2222222;
  11.  
  12. int n, q;
  13.  
  14. int type[MAXQ], v1[MAXQ], v2[MAXQ], comple[MAXQ];
  15. int *u[MAXQ];
  16. int k[MAXQ];
  17.  
  18. int parent[MAXN], sz[MAXN];
  19.  
  20. int *pointers[2 * MAXQ], values[2 * MAXQ];
  21. int cnt = 0;
  22.  
  23. int findSet(int v) {
  24.     if (parent[v] == v) {
  25.         return v;
  26.     } else {
  27.         return findSet(parent[v]);
  28.     }
  29. }
  30.  
  31. void join(int v1, int v2) {
  32.     int s1 = findSet(v1), s2 = findSet(v2);
  33.     if (s1 != s2) {
  34.         if (sz[s2] > sz[s1]) {
  35.             swap(s1, s2);
  36.         }
  37.         pointers[cnt] = &parent[s2];
  38.         values[cnt] = parent[s2];
  39.         cnt++;
  40.         parent[s2] = s1;
  41.         pointers[cnt] = &sz[s1];
  42.         values[cnt] = sz[s1];
  43.         cnt++;
  44.         sz[s1] += sz[s2];
  45.     }
  46. }
  47.  
  48. void decompose(int l, int r) {
  49.     if (l == r) {
  50.         if (type[l] == 3) {
  51.             vector<int> sorted(k[l]);
  52.             for (int i = 0; i < k[l]; i++) {
  53.                 sorted[i] = findSet(u[l][i]);
  54.             }
  55.             sort(sorted.begin(), sorted.end());
  56.             int sumsize = 0;
  57.             int len = sorted.size();
  58.             for (int i = 0; i < len; ) {
  59.                 int j = i;
  60.                 while (j < len && sorted[j] == sorted[i]) {
  61.                     j++;
  62.                 }
  63.                 sumsize += sz[sorted[i]];
  64.                 i = j;
  65.             }
  66.             if (sumsize == len) {
  67.                 puts("YES");
  68.             } else {
  69.                 puts("NO");
  70.             }
  71.         }
  72.     } else {
  73.         int m = (l + r) / 2;
  74.         int startcnt = cnt;
  75.  
  76.         for (int i = m + 1; i <= r; i++) {
  77.             if (type[i] == 2 && comple[i] < l) {
  78.                 int from = v1[comple[i]], to = v2[comple[i]];
  79.                 join(from, to);
  80.             }
  81.         }
  82.  
  83.         decompose(l, m);
  84.            
  85.         while (cnt > startcnt) {
  86.             *pointers[cnt - 1] = values[cnt - 1];
  87.             cnt--;
  88.         }
  89.            
  90.         for (int i = l; i <= m; i++) {
  91.             if (type[i] == 1 && comple[i] > r) {
  92.                 int from = v1[i], to = v2[i];
  93.                 join(from, to);
  94.             }
  95.         }
  96.            
  97.         decompose(m + 1, r);
  98.            
  99.         while (cnt > startcnt) {
  100.             *pointers[cnt - 1] = values[cnt - 1];
  101.             cnt--;
  102.         }
  103.     }
  104. }
  105.  
  106. int main() {
  107.     scanf("%d %d", &n, &q);
  108.        
  109.     for (int i = 0; i < n; i++) {
  110.         parent[i] = i;
  111.         sz[i] = 1;
  112.     }
  113.    
  114.     vector<int> addTime(q);
  115.     int addCnt = 0;
  116.        
  117.     for (int i = 0; i < q; i++) {
  118.         scanf("%d", &type[i]);
  119.         if (type[i] == 1) {
  120.             scanf("%d %d", &v1[i], &v2[i]);
  121.             v1[i]--;
  122.             v2[i]--;
  123.             comple[i] = q;
  124.             addTime[addCnt++] = i;
  125.         } else if (type[i] == 2) {
  126.             int m;
  127.             scanf("%d", &m);
  128.             m--;
  129.             comple[i] = addTime[m];
  130.             comple[addTime[m]] = i;
  131.         } else {
  132.             scanf("%d", &k[i]);
  133.             u[i] = new int[k[i]];
  134.             for (int j = 0; j < k[i]; j++) {
  135.                 int val;
  136.                 scanf("%d", &val);
  137.                 val--;
  138.                 u[i][j] = val;
  139.             }
  140.         }
  141.     }
  142.        
  143.     decompose(0, q - 1);
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement