Advertisement
Guest User

Untitled

a guest
May 19th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define pb push_back
  6. #define all(a) a.begin(), a.end()
  7. #define rall(a) a.rbegin(), a.rend()
  8.  
  9. void out(vector<int> a) {
  10. for (auto it = a.begin(); it != a.end(); ++it) cout << (*it) << " ";
  11. cout << endl;
  12. }
  13.  
  14. struct node{
  15. int l, r;
  16. int mn = 1e9;
  17. };
  18.  
  19. int n;
  20. vector<pair<int, int > > a;
  21. const int N = 5e5;
  22. node tree[4*N];
  23.  
  24. inline void read() {
  25. cin >> n;
  26. a.resize(n);
  27. for (int i = 0; i<n; ++i) cin >> a[i].first >> a[i].second;
  28. }
  29.  
  30. vector<pair<int, pair<bool, int> > > b;
  31. vector<int> res;
  32.  
  33. inline void solve1() {
  34. res.resize(n, n-1);
  35. for (int i = 0; i<n; ++i) {
  36. b.pb({a[i].first, {0, i}});
  37. b.pb({a[i].second, {1, i}});
  38. }
  39. sort(all(b));
  40.  
  41. vector<pair<int, int> > pref(2*n);
  42. if (b[0].second.first == 0) ++pref[0].first;
  43. else ++pref[0].second;
  44. for (int i = 1; i<2*n; ++i) {
  45. pref[i] = pref[i-1];
  46. if (b[i].second.first == 0) ++pref[i].first;
  47. else ++pref[i].second;
  48. }
  49.  
  50. for (int i = 0; i<2*n; ++i) {
  51. int id = b[i].second.second;
  52. int d;
  53. if (b[i].second.first == 0) d = pref[i].second;
  54. else d = pref[2*n-1].first - pref[i].first;
  55. res[id] -= d;
  56. }
  57. }
  58.  
  59. void push(int i) {
  60. if (tree[i].mn != 1e9 && tree[i].l != tree[i].r) {
  61. tree[2 * i].mn = min(tree[2 * i].mn, tree[i].mn);
  62. tree[2 * i + 1].mn = min(tree[2 * i + 1].mn, tree[i].mn);
  63. tree[i].mn = 1e9;
  64. }
  65. }
  66.  
  67. void build(int i, int l, int r) {
  68. if (l > r) return;
  69. tree[i].l = l, tree[i].r = r;
  70. if (l == r) {
  71. tree[i].mn = 1e9;
  72. return;
  73. }
  74. int mid = (l + r) / 2;
  75. build(2 * i, l, mid);
  76. build(2 * i + 1, mid + 1, r);
  77. tree[i].mn = min(tree[2 * i].mn, tree[2 * i + 1].mn);
  78. }
  79.  
  80. void update(int i, int l, int r, int val) {
  81. push(i);
  82. if (tree[i].l > r || tree[i].r < l) return;
  83. if (tree[i].l >= l && tree[i].r <= r) {
  84. tree[i].mn = min(tree[i].mn, val);
  85. return;
  86. }
  87. update(2 * i, l, r, val);
  88. update(2 * i + 1, l, r, val);
  89. tree[i].mn = min(tree[2 * i].mn, tree[2 * i + 1].mn);
  90. }
  91.  
  92. int get_min(int i, int l, int r) {
  93. push(i);
  94. if (l > r || r < tree[i].l || l > tree[i].r) return 1e9;
  95. if (l <= tree[i].l && r >= tree[i].r) return tree[i].mn;
  96. return min(get_min(2 * i, l, r), get_min(2 * i + 1, l, r));
  97. }
  98.  
  99. inline void solve2() {
  100. vector<pair<int, int> > start(n);
  101. for (int i = 0; i<2*n; ++i) {
  102. int id = b[i].second.second;
  103. if (b[i].second.first == 0) start[id] = {i, start[id].second};
  104. else start[id] = {start[id].first, i};
  105. }
  106. build(1, 0, 2*n-1);
  107.  
  108. for (int i = 0; i<n; ++i) cout << res[i] << " ";
  109. cout << endl;
  110. for (int i = 0; i<n; ++i) {
  111. cout << start[i].first << " " << start[i].second << endl;
  112. }
  113. for (int i = 0; i<n; ++i) {
  114. update(1, start[i].first, start[i].second, res[i]);
  115. }
  116. for (int i = 0; i<n; ++i) {
  117. cout << get_min(1, start[i].first, start[i].second) << " ";
  118. }
  119. }
  120.  
  121. signed main() {
  122. ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  123. cout << fixed << setprecision(20);
  124. //freopen("input.txt", "r", stdin);
  125. //freopen("output.txt", "w", stdout);
  126. read();
  127. solve1();
  128. solve2();
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement