Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cmath>
  4. #include <cstdlib>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. int a, b, c, fl, chislo, lg, n;
  10. char ch;
  11. int arr[100001];
  12. int arr1[100001];
  13. int parent[100001];
  14. int mas[100001][3];
  15. int sp[30][50001];
  16. int log1[100001];
  17. int unlog[100001];
  18. int poiskovik[100001];
  19.  
  20. struct Node
  21. {
  22. int x = 0, y = 0, p = 0;
  23. Node *l, *r;
  24. };
  25.  
  26.  
  27. void debug_tree(Node *t) {
  28. if (t == NULL) return;
  29.  
  30. cout << " { ";
  31. debug_tree(t -> l);
  32. cout << " } ";
  33.  
  34. cout << t -> x;
  35.  
  36. cout << " { ";
  37. debug_tree(t -> r);
  38. cout << " } ";
  39. }
  40.  
  41. void split(Node *node, int k, Node *&l, Node *&r)
  42. {
  43. l = NULL;
  44. r = NULL;
  45. if (node == NULL)
  46. return;
  47. if (node -> x < k)
  48. {
  49. split(node -> r, k, node -> r, r);
  50. l = node;
  51. }
  52. else
  53. {
  54. split(node -> l, k, l, node -> l);
  55. r = node;
  56. }
  57. }
  58.  
  59. Node* Merge(Node *l, Node *r)
  60. {
  61. if (l == NULL)
  62. return r;
  63. if (r == NULL)
  64. return l;
  65. if (l -> y > r -> y)
  66. {
  67. l -> r = Merge(l -> r, r);
  68. return l;
  69. }
  70. else
  71. {
  72. r -> l = Merge(l, r -> l);
  73. return r;
  74. }
  75. }
  76.  
  77. Node* next(Node *t, int k)
  78. {
  79. Node *l, *r, *l1;
  80. split(t, k + 1, l, r);
  81. l1 = r;
  82. if (r == NULL) return Merge(l, r);
  83. while (l1 -> l != NULL)
  84. l1 = l1 -> l;
  85. chislo = l1 -> x;
  86. return Merge(l, r);
  87. }
  88.  
  89. Node* prev(Node *t, int k)
  90. {
  91. Node *l, *r, *l1;
  92. split(t, k, l, r);
  93. l1 = l;
  94. if (l == NULL) return Merge(l, r);
  95. while (l1 -> r != NULL)
  96. l1 = l1 -> r;
  97. chislo = l1 -> x;
  98. return Merge(l, r);
  99. }
  100.  
  101. Node* inser(Node *t, int k)
  102. {
  103. Node *l, *r;
  104. split(t, k, l, r);
  105. Node* m = new Node;
  106. m -> x = k;
  107. m -> y = rand();
  108. m -> l = NULL;
  109. m -> r = NULL;
  110. return Merge(l, Merge(m, r));
  111. }
  112.  
  113. Node* delet(Node *t, int k)
  114. {
  115. Node *l, *r, *r1, *l1;
  116. split(t, k, l, r);
  117. l1 = l;
  118. r1 = r;
  119. split(r1, k + 1, l, r);
  120. return Merge(l1, r);
  121. }
  122.  
  123. void vivedi_pls_otvet(Node *start, int n)
  124. {
  125. if (n == -30002)
  126. mas[parent[start -> x + 30000]][0] = 0;
  127. else
  128. mas[parent[start -> x + 30001]][0] = parent[n + 30001] + 1;
  129. if (start -> l != NULL)
  130. mas[parent[start -> x + 30001]][1] = parent[start -> l -> x + 30001] + 1;
  131. else
  132. mas[parent[start -> x + 30001]][1] = 0;
  133. if (start -> r != NULL)
  134. mas[parent[start -> x + 30001]][2] = parent[start -> r -> x + 30001] + 1;
  135. else
  136. mas[parent[start -> x + 30001]][2] = 0;
  137. if (start -> l != NULL) vivedi_pls_otvet(start -> l, start -> x);
  138. if (start -> r != NULL) vivedi_pls_otvet(start -> r, start -> x);
  139. }
  140.  
  141. Node* searc(Node *t, int n)
  142. {
  143. Node *l, *r, *r1, *l1;
  144. split(t, n, l, r);
  145. l1 = r;
  146. if (r == NULL) return Merge(l, r);
  147. while (l1 -> l != NULL)
  148. l1 = l1 -> l;
  149. if (n == l1 -> x) fl = 1;
  150. return Merge(l, r);
  151. }
  152.  
  153. void qsort(int l, int r)
  154. {
  155. if (r - l <= 1) return;
  156. int i1 = l;
  157. int j1 = l;
  158. int x = arr[l + rand() % (r - l)];
  159. for (int k = l; k < r; ++k)
  160. {
  161. if (arr[k] == x)
  162. {
  163. swap(arr[k], arr[j1]);
  164. swap(arr1[k], arr1[j1]);
  165. ++j1;
  166. }
  167. if (arr[k] < x)
  168. {
  169. swap(arr[k], arr[i1]);
  170. swap(arr1[k], arr1[i1]);
  171. ++i1;
  172. if (j1 < i1) ++j1;
  173. }
  174. }
  175. qsort(l, i1);
  176. qsort(j1, r);
  177. }
  178.  
  179. Node* dfs(int l, int r)
  180. {
  181. Node *m = new Node;
  182. if (r - l <= 0)
  183. {
  184. m -> l = NULL;
  185. m -> r = NULL;
  186. m -> x = arr[r];
  187. m -> y = arr1[r];
  188. return m;
  189. }
  190. int max1 = 10000000;
  191. int nomer = -1;
  192. max1 = min(sp[unlog[r - l]][l], sp[unlog[r - l]][r - log1[unlog[r - l]] + 1]);
  193. nomer = poiskovik[max1 + 30001];
  194. m -> x = arr[nomer];
  195. m -> y = arr1[nomer];
  196. if (nomer - 1 >= l)
  197. m -> l = dfs(l, nomer - 1);
  198. else
  199. m -> l = NULL;
  200. if (r >= nomer + 1)
  201. m -> r = dfs(nomer + 1, r);
  202. else
  203. m -> r = NULL;
  204. return m;
  205. }
  206.  
  207. int main()
  208. {
  209. freopen("cartesian.in", "r", stdin);
  210. freopen("cartesian.out", "w", stdout);
  211. Node *start = NULL;
  212. Node *root = NULL;
  213. int kol = 0;
  214. cin >> a;
  215. for (int i = 0; i < a; ++i)
  216. {
  217. cin >> arr[i] >> arr1[i];
  218. parent[arr[i] + 30001] = i;
  219. }
  220. qsort(0, a);
  221. for (int i = 0; i < a; ++i)
  222. {
  223. poiskovik[arr1[i] + 30001] = i;
  224. }
  225. for (int i = 0; i < a; ++i)
  226. sp[0][i] = arr1[i];
  227. int chislo = 1;
  228. for (int i = 1; i < 21; ++i)
  229. {
  230. if (chislo <= a)
  231. {
  232. ++lg;
  233. chislo = chislo * 2;
  234. log1[lg] = chislo;
  235. }
  236. }
  237. log1[0] = 1;
  238. chislo = 0;
  239. unlog[1] = 0;
  240. int p = 2;
  241. for (int i = 2; i < 100001; ++i)
  242. {
  243. if (i >= p)
  244. {
  245. p = p * 2;
  246. ++chislo;
  247. }
  248. unlog[i] = chislo;
  249. }
  250. for (int i = 1; i < lg; ++i)
  251. {
  252. n += log1[i - 1];
  253. for (int j = 0; j < a - n; ++j)
  254. {
  255. sp[i][j] = min(sp[i - 1][j], sp[i - 1][j + log1[i - 1]]);
  256. }
  257. }
  258. start = dfs(0, a - 1);
  259. vivedi_pls_otvet(start, -30002);
  260. cout << "YES" << endl;
  261. for (int i = 0; i < a; ++i)
  262. {
  263. cout << mas[i][0] << " " << mas[i][1] << " " << mas[i][2] << endl;
  264. }
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement