Advertisement
Mehulcoder

BS

Oct 22nd, 2020 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. /*
  2. Author: Mehul Chaturvedi
  3. Talent is overrated
  4. */
  5.  
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8.  
  9. using ll = int;
  10. using ld = long double;
  11. using pll = pair<ll, ll>;
  12.  
  13. #define mp make_pair
  14. #define all(x) (x).begin(), (x).end()
  15. #define f first
  16. #define s second
  17. #define vll vector<long long>
  18. #define vvll vector<vector<ll>>
  19. #define vset(v, n, val) \
  20.     v.clear();          \
  21.     v.resize(n, val)
  22. #define INF 4557430888798830399ll
  23. #define fr(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
  24. #define rep(i, n) for (int i = 0, _n = (n); i < _n; i++)
  25. #define repr(i, n) for (int i = n; i >= 0; i--)
  26. #define frr(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
  27. #define trav(a, x) for (auto &a : x)
  28. #define fil(ar, val) memset(ar, val, sizeof(ar))
  29. const ll MOD = 1e9 + 7;
  30.  
  31. /*
  32.     At each node representin [tl,tr), I store the sorted array from tl to tr-1
  33.     Rest is pretty trivial? Just use lower_bound
  34. */
  35. class node {
  36.     public:
  37.     vll arr;
  38.  
  39.     node(vll val) {
  40.         arr = val;
  41.     }
  42. };
  43.  
  44. vector<ll> v;
  45. vector<node> t;
  46. ll n, m;
  47. ll anss;
  48.  
  49. node help(node &left, node &right) {
  50.     vll &arr1 = left.arr;
  51.     vll &arr2 = right.arr;
  52.  
  53.     vll arr0;
  54.     arr0.resize(arr1.size() + arr2.size());
  55.     merge(all(arr1), all(arr2), arr0.begin());
  56.    
  57.     node res(arr0);
  58.     return res;
  59. }
  60.  
  61. void build(ll start, ll tl, ll tr) {
  62.     if (tl + 1 == tr) {
  63.         t[start] = node({v[tl]});
  64.         return;
  65.     }
  66.  
  67.     ll mid = (tl + tr) / 2;
  68.     build(2 * start + 1, tl, mid);
  69.     build(2 * start + 2, mid, tr);
  70.    
  71.     node &left = t[2 * start + 1];
  72.     node &right = t[2 * start + 2];
  73.    
  74.     t[start] = help(left, right);
  75.     return;
  76. }
  77.  
  78. ll get(ll start, ll tl, ll tr, ll l, ll r, ll num) {
  79.     if (tl >= r || tr <= l) {
  80.         // anss = 0;
  81.         return 0;
  82.     }
  83.  
  84.     if (l <= tl && r >= tr) {
  85.         vll &temp = (t[start]).arr;
  86.         ll anss = lower_bound(all(temp), v[l]) - temp.begin();
  87.         return anss;
  88.     }
  89.  
  90.     ll mid = (tl + tr) / 2;
  91.     ll left = get(2 * start + 1, tl, mid, l, r, num);
  92.     ll right = get(2 * start + 2, mid, tr, l, r, num);
  93.     ll ans = left+right;
  94.  
  95.     return ans;
  96. }
  97.  
  98. vector<int> solve(vector<int> &nums) {
  99.     t.clear();
  100.     n = nums.size();
  101.     if (n == 0) return {};
  102.    
  103.     v = nums;
  104.     t.resize(4 * n, node({}));
  105.    
  106.     build(0, 0, n);
  107.     ll q = nums.size();
  108.  
  109.     vector<int> ress;
  110.     ll l = 0;
  111.     while (q--) {
  112.         auto temp = get(0, 0, n, l, n, v[l]);
  113.         l++;
  114.         ress.push_back(temp);
  115.     }
  116.  
  117.     return ress;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement