Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <assert.h>
  4.  
  5. using namespace std;
  6.  
  7. static const int MAX_N = 32000;
  8. int tree[MAX_N * 4];
  9.  
  10. struct segment_tree {
  11.  
  12. using vref = const vector<int> &;
  13.  
  14. explicit segment_tree(vref arr): n(int(arr.size())) {
  15. build_(arr, 1, 0, n - 1);
  16. }
  17.  
  18. int sum(int l, int r) {
  19. return sum_(1, 0, n - 1, l, r);
  20. }
  21.  
  22. void add(int pos, int val) {
  23. add_(1, 0, n - 1, pos, val);
  24. }
  25.  
  26. private:
  27.  
  28. int sum_(int v, int tl, int tr, int l, int r) {
  29. if (l > r) {
  30. return 0;
  31. }
  32. if (tl == l && tr == r) {
  33. return tree[v];
  34. }
  35. int m = (tl + tr) / 2;
  36. int left_sum = sum_(v * 2, tl, m, l, min(r, m));
  37. int right_sum = sum_(v * 2 + 1, m + 1, tr, max(l, m + 1), r);
  38. return left_sum + right_sum;
  39. }
  40.  
  41. void build_(vref arr, int v, int tl, int tr) {
  42. if (tl == tr) {
  43. tree[v] = arr[tl];
  44. } else {
  45. int m = (tl + tr) / 2;
  46. build_(arr, v * 2, tl, m);
  47. build_(arr, v * 2 + 1, m + 1, tr);
  48. tree[v] = tree[v * 2] + tree[v * 2 + 1];
  49. }
  50. }
  51.  
  52. void add_(int v, int tl, int tr, int pos, int val) {
  53. if (tl == tr) {
  54. tree[v] += val;
  55. } else {
  56. int m = (tl + tr) / 2;
  57. if (pos <= m) {
  58. add_(2 * v, tl, m, pos, val);
  59. } else {
  60. add_(2 * v + 1, m + 1, tr, pos, val);
  61. }
  62. tree[v] = tree[2 * v] + tree[2 * v + 1];
  63. }
  64. }
  65. int n;
  66. };
  67.  
  68.  
  69. void segment_tree_test() {
  70. vector<int> a = {1,1,1,1,1,1};
  71. segment_tree t{a};
  72. assert(t.sum(0, 5) == 6);
  73. t.add(2, 1);
  74. assert(t.sum(0, 5) == 7);
  75. assert(t.sum(2, 2) == 2);
  76.  
  77. segment_tree t2{{100}};
  78. assert(t2.sum(0, 0) == 100);
  79. t2.add(0, -50);
  80. assert(t2.sum(0, 0) == 50);
  81.  
  82. }
  83.  
  84. int main() {
  85.  
  86. ios_base::sync_with_stdio(0); // отключение синхронизации с printf,scanf
  87. cin.tie(0); // отключение синхронизации с cout
  88.  
  89. while (true) {
  90. int n; cin >> n;
  91. vector<int> arr(32000);
  92. segment_tree t(arr);
  93. vector<int> levels(n);
  94. for (int i = 0; i < n; ++i) {
  95. int x, y; cin >> x >> y;
  96. t.add(x, 1);
  97. int level = t.sum(0, x) - 1;
  98. ++levels[level];
  99. }
  100.  
  101. for (int j = 0; j < levels.size(); ++j) {
  102. cout << levels[j];
  103. if (j < levels.size() - 1) {
  104. cout << '\n';
  105. }
  106. }
  107.  
  108. if (cin.eof()) {
  109. break;
  110. }
  111.  
  112. cout << '\n';
  113. }
  114.  
  115. return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement