Advertisement
Guest User

Untitled

a guest
Jul 30th, 2015
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <set>
  5. //#include <unordered_set>
  6. #include <fstream>
  7. #include <map>
  8. //#include <unordered_map>
  9. #include <random>
  10. #include <stack>
  11. //#include <stdio.h>
  12. #include <algorithm>
  13. #include <cmath>
  14.  
  15. //#include <ctime>
  16.  
  17. using namespace std;
  18. #define ll long long
  19. #define MOD 1000000007
  20. #define mp(a, b) make_pair(a, b)
  21. #define PI 3.1415926535
  22. #define EPS 0.00000001
  23. #define pii pair<int, int>
  24. #define INF 1000000000ll*1000000000ll
  25.  
  26. #define DEBUG 41
  27.  
  28. #ifndef DEBUG
  29.  
  30. ifstream in("input.in");
  31. ofstream out("output.out");
  32.  
  33. #define cin in
  34. #define cout out
  35.  
  36. #endif
  37.  
  38. int parent[654321];
  39. int rak[654321];
  40.  
  41. void make_set (int v)
  42. {
  43. parent[v] = v;
  44. rak[v] = 0;
  45. }
  46.  
  47. int find_set (int v) {
  48. if (v == parent[v])
  49. return v;
  50. return parent[v] = find_set (parent[v]);
  51. }
  52.  
  53. void union_sets (int a, int b) {
  54. a = find_set (a);
  55. b = find_set (b);
  56. if (a != b) {
  57. if (rak[a] < rak[b])
  58. swap (a, b);
  59. parent[b] = a;
  60. if (rak[a] == rak[b])
  61. ++rak[a];
  62. }
  63. }
  64.  
  65. map<int, int> mapka;
  66.  
  67.  
  68. int main()
  69. {
  70. ios_base::sync_with_stdio(0);
  71. cin.tie(0);
  72. int n, q;
  73. cin >> n >> q;
  74. for(int i = 1; i <= n; ++i)
  75. parent[i] = i;
  76. for(int i = 0; i < q; ++i)
  77. {
  78. int type;
  79. cin >> type;
  80. int l, r;
  81. cin >> l >> r;
  82. if(type == 3)
  83. {
  84. if(find_set(l) == find_set(r))
  85. cout << "YES\n";
  86. else
  87. cout << "NO\n";
  88. }
  89. else if(type == 1)
  90. union_sets(l, r);
  91. else
  92. {
  93. if(l > r)
  94. swap(l, r);
  95. if(l == r)
  96. continue;
  97. if(mapka.size() == 0)
  98. {
  99. for(int i = l+1; i <= r; ++i)
  100. union_sets(l, i);
  101. mapka[l] = r;
  102. }
  103. else
  104. {
  105. map<int, int>::iterator it = mapka.lower_bound(l);
  106. if(it != mapka.end() && it != mapka.begin())
  107. {
  108. --it;
  109. int cur = l+1;
  110. int curL = cur;
  111. int curR = r;
  112. if(cur <= it->second)
  113. {
  114. cur = it->second;
  115. union_sets(l, l+1);
  116. curL = min(cur, it->first);
  117. mapka.erase(it);
  118. }
  119.  
  120. for(cur; cur <= r; ++cur)
  121. {
  122.  
  123. it = mapka.find(cur);
  124. if(it != mapka.end())
  125. {
  126. cur = it->second;
  127. curR = max(curR, it->second);
  128. mapka.erase(it);
  129. }
  130. union_sets(l, cur);
  131. }
  132. mapka[curL] = curR;
  133. }
  134. else
  135. {
  136. for(int i = l+1; i <= r; ++i)
  137. union_sets(l, i);
  138. mapka[l] = r;
  139. }
  140. }
  141. }
  142. }
  143. }
  144.  
  145. /*
  146. n-1 m
  147. m-1 n
  148.  
  149. n^2 - 2n + 1 + m^2
  150. n^2 - 2m + 1 + m^2
  151. n <= m
  152. 100 4
  153. 2 10 20
  154. 2 30 40
  155. 2 20 30
  156. 3 10 40
  157. NO
  158.  
  159. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement