Advertisement
Guest User

Untitled

a guest
Jul 15th, 2013
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.16 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. struct Action {
  11.  
  12.     int *pos;
  13.     int prevval;
  14.  
  15.     inline Action(int *pos, int prevval) {
  16.         this->pos = pos;
  17.         this->prevval = prevval;
  18.     }
  19.  
  20.     inline void undo() {
  21.         *pos = prevval;
  22.     }
  23.  
  24. };
  25.  
  26. const int MAXN = 1111111, MAXQ = 2222222;
  27.  
  28. int n, q;
  29.  
  30. int type[MAXQ], v1[MAXQ], v2[MAXQ], comple[MAXQ];
  31. int *u[MAXQ];
  32. int k[MAXQ];
  33.  
  34. int parent[MAXN], sz[MAXN];
  35.  
  36. stack<Action> stacks[25];
  37. int level = -1;
  38.  
  39. int findSet(int v) {
  40.     if (parent[v] == v) {
  41.         return v;
  42.     } else {
  43.         return findSet(parent[v]);
  44.     }
  45. }
  46.  
  47. void join(int v1, int v2, stack<Action> &stack) {
  48.     int s1 = findSet(v1), s2 = findSet(v2);
  49.     if (s1 != s2) {
  50.         if (sz[s2] > sz[s1]) {
  51.             swap(s1, s2);
  52.         }
  53.         stack.push(Action(&parent[s2], parent[s2]));
  54.         parent[s2] = s1;
  55.         stack.push(Action(&sz[s1], sz[s1]));
  56.         sz[s1] += sz[s2];
  57.     }
  58. }
  59.    
  60. inline void undoAll(stack<Action> &stack) {
  61.     while (stack.size() > 0) {
  62.         stack.top().undo();
  63.         stack.pop();
  64.     }
  65. }
  66.  
  67. void decompose(int l, int r) {
  68.     level++;
  69.     /*
  70.     cout << l << " " << r << endl;
  71.     for (int i = 0; i < n; i++) {
  72.         cout << findSet(i) << " ";
  73.     }
  74.     cout << endl;
  75.     for (int i = 0; i < n; i++) {
  76.         cout << sz[i] << " ";
  77.     }
  78.     cout << endl;
  79.     cout << endl;
  80.     */
  81.     if (l == r) {
  82.         if (type[l] == 3) {
  83.             vector<int> sorted(k[l]);
  84.             for (int i = 0; i < k[l]; i++) {
  85.                 sorted[i] = findSet(u[l][i]);
  86.             }
  87.             sort(sorted.begin(), sorted.end());
  88.             int sumsize = 0;
  89.             int len = sorted.size();
  90.             for (int i = 0; i < len; ) {
  91.                 int j = i;
  92.                 while (j < len && sorted[j] == sorted[i]) {
  93.                     j++;
  94.                 }
  95.                 sumsize += sz[sorted[i]];
  96.                 i = j;
  97.             }
  98.             if (sumsize == len) {
  99.                 puts("YES");
  100.             } else {
  101.                 puts("NO");
  102.             }
  103.         }
  104.     } else {
  105.         int m = (l + r) / 2;
  106.  
  107.         stack<Action> &stack = stacks[level];
  108.         if (stack.size() != 0) {
  109.             exit(1);
  110.         }
  111.  
  112.         for (int i = m + 1; i <= r; i++) {
  113.             if (type[i] == 2 && comple[i] < l) {
  114.                 int from = v1[comple[i]], to = v2[comple[i]];
  115.                 join(from, to, stack);
  116.             }
  117.         }
  118.  
  119.         decompose(l, m);
  120.            
  121.         undoAll(stack);
  122.            
  123.         for (int i = l; i <= m; i++) {
  124.             if (type[i] == 1 && comple[i] > r) {
  125.                 int from = v1[i], to = v2[i];
  126.                 join(from, to, stack);
  127.             }
  128.         }
  129.            
  130.         decompose(m + 1, r);
  131.            
  132.         undoAll(stack);
  133.     }
  134.     level--;
  135. }
  136.  
  137. int main() {
  138.     //freopen("input.txt", "r", stdin);
  139.     scanf("%d %d", &n, &q);
  140.        
  141.     for (int i = 0; i < n; i++) {
  142.         parent[i] = i;
  143.         sz[i] = 1;
  144.     }
  145.    
  146.     vector<int> addTime(q);
  147.     int addCnt = 0;
  148.        
  149.     for (int i = 0; i < q; i++) {
  150.         scanf("%d", &type[i]);
  151.         if (type[i] == 1) {
  152.             scanf("%d %d", &v1[i], &v2[i]);
  153.             v1[i]--;
  154.             v2[i]--;
  155.             comple[i] = q;
  156.             addTime[addCnt++] = i;
  157.         } else if (type[i] == 2) {
  158.             int m;
  159.             scanf("%d", &m);
  160.             m--;
  161.             comple[i] = addTime[m];
  162.             comple[addTime[m]] = i;
  163.         } else {
  164.             scanf("%d", &k[i]);
  165.             u[i] = new int[k[i]];
  166.             for (int j = 0; j < k[i]; j++) {
  167.                 int val;
  168.                 scanf("%d", &val);
  169.                 val--;
  170.                 u[i][j] = val;
  171.             }
  172.         }
  173.     }
  174.        
  175.     int logq = 0, qc = q;
  176.     while (qc > 1) {
  177.         qc = (qc + 1) / 2;
  178.         logq++;
  179.     }
  180.        
  181.     decompose(0, q - 1);
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement