Mehulcoder

Long Distance

Oct 22nd, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 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 = long long;
  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) v.clear(); v.resize(n, val)
  20. #define INF 4557430888798830399ll
  21. #define fr(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
  22. #define rep(i, n) for (int i = 0, _n = (n); i < _n; i++)
  23. #define repr(i, n) for (int i = n; i >= 0; i--)
  24. #define frr(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
  25. #define trav(a, x) for(auto& a : x)
  26. #define fil(ar, val) memset(ar, val, sizeof(ar))
  27. const ll MOD = 1e9 + 7;
  28.  
  29. class node {
  30. public:
  31.     vll arr;
  32.  
  33.     node(vll val) {
  34.         arr = val;
  35.     }
  36.  
  37. };
  38.  
  39. vector<ll> v;
  40. vector<node> t;
  41. ll n, m;
  42. ll anss;
  43.  
  44. node help(node left, node right) {
  45.     vll arr1 = left.arr;
  46.     vll arr2 = right.arr;
  47.  
  48.     vll arr0;
  49.     arr0.resize(arr1.size() + arr2.size());
  50.     merge(all(arr1), all(arr2), arr0.begin());
  51.     node res(arr0);
  52.  
  53.     return res;
  54. }
  55.  
  56. void build(ll start, ll tl, ll tr) {
  57.     if (tl + 1 == tr) {
  58.         //Only one element in the vector
  59.         t[start] = node({v[tl]});
  60.         return;
  61.     }
  62.  
  63.     ll mid = (tl + tr) / 2;
  64.     build(2 * start + 1, tl, mid);
  65.     build(2 * start + 2, mid, tr);
  66.     node left = t[2 * start + 1];
  67.     node right = t[2 * start + 2];
  68.     t[start] =  help(left, right);
  69.     return;
  70. }
  71.  
  72.  
  73. node get(ll start, ll tl, ll tr, ll l, ll r, ll num) {
  74.     if (tl >= r || tr <= l) {
  75.         anss = 0;
  76.         return node({});
  77.     }
  78.  
  79.     if (l <= tl && r >= tr) {
  80.         auto &temp = t[start].arr;
  81.         anss = temp.end() - upper_bound(all(temp), num);
  82.         return t[start];
  83.     }
  84.  
  85.     ll mid = (tl + tr) / 2;
  86.     node left = get(2 * start + 1, tl, mid, l, r, num);
  87.     node right = get(2 * start + 2, mid, tr, l, r, num);
  88.     node ans = help(left, right);
  89.  
  90.     auto &temp = ans.arr;
  91.     anss = temp.end() - upper_bound(all(temp), num);
  92.     return ans;
  93. }
  94.  
  95. void solve() {
  96.     cin >> n;
  97.     v.clear();
  98.     v.resize(n, 0);
  99.     t.clear();
  100.     t.resize(4 * n, node({}));
  101.     rep(i, n) {
  102.         cin >> v[i];
  103.     }
  104.  
  105.     build(0, 0, n);
  106.     ll q; cin >> q;
  107.  
  108.     while (q--) {
  109.         ll l, r, k;
  110.         cin >> l >> r >> k;
  111.         auto ans = get(0, 0, n, l, r + 1, k);
  112.         cout << anss << '\n';
  113.     }
  114.  
  115.     return;
  116. }
  117.  
  118. int main(int argc , char ** argv) {
  119.     ios_base::sync_with_stdio(false) ;
  120.     cin.tie(NULL) ;
  121.  
  122.     ll t = 1;
  123.     while (t--) {
  124.         solve();
  125.     }
  126.  
  127.     return 0 ;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment