Advertisement
Guest User

Number of elements <x, partial cascading

a guest
Dec 1st, 2015
3,668
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <functional>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <numeric>
  5. #include <cassert>
  6. #include <cstdlib>
  7. #include <cstring>
  8. #include <string>
  9. #include <cstdio>
  10. #include <vector>
  11. #include <ctime>
  12. #include <queue>
  13. #include <set>
  14. #include <map>
  15. using namespace std;
  16. #define forn(i, n) for (int i = 0; i < (int)(n); ++i)
  17. #define fore(i, b, e) for (int i = (int)(b); i <= (int)(e); ++i)
  18. #define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
  19. #define mp make_pair
  20. #define pb push_back
  21. #define fi first
  22. #define se second
  23. #define all(x) (x).begin(), (x).end()
  24. typedef vector<int> vi;
  25. typedef pair<int, int> pii;
  26. typedef long long i64;
  27. typedef unsigned long long u64;
  28. const int inf = 1e9+100500;
  29.  
  30. int cnt = 0;
  31.  
  32. struct node {
  33.     int l, r;
  34.     node *L, *R;
  35.     vi val;
  36.     int *lp, *rp;
  37.  
  38.     node(int l, int r, int a[]) : l(l), r(r) {
  39.         if (l == r) {
  40.             L = R = NULL;
  41.             val = {a[l]};
  42.         } else {
  43.             L = new node(l, (l+r)/2, a);
  44.             R = new node((l+r)/2+1, r, a);
  45.             int n = L->r - L->l + 1;
  46.             int m = R->r - R->l + 1;
  47.             val.reserve(n+m);
  48.             val.resize(n+m);
  49.             lp = new int[n+m+1];
  50.             rp = new int[n+m+1];
  51.             int i = 0, j = 0;
  52.             while (i < n || j < m) {
  53.                 lp[i+j] = i;
  54.                 rp[i+j] = j;
  55.                 if (j == m || (i != n && L->val[i] < R->val[j])) {
  56.                     val[i+j] = L->val[i];
  57.                     ++i;
  58.                 } else {
  59.                     val[i+j] = R->val[j];
  60.                     ++j;
  61.                 }
  62.             }
  63.             lp[n+m] = n;
  64.             rp[n+m] = m;
  65.         }
  66.     }
  67.  
  68.     // # if elements < x
  69.     int get(int lq, int rq, int x, int p = -1) {
  70.         if (p == -1) {
  71.             ++cnt;
  72.             p = lower_bound(all(val), x) - val.begin();
  73.         }
  74.         if (lq <= l && rq >= r) {
  75.             return p;
  76.         } else if (rq < l || lq > r) {
  77.             return 0;
  78.         } else {
  79.             return L->get(lq, rq, x, lp[p]) + R->get(lq, rq, x, rp[p]);
  80.         }
  81.     }
  82. };
  83.  
  84. int a[500000];
  85.  
  86. int main() {
  87. #ifdef HOME
  88.     freopen("input.txt", "r", stdin);
  89. #endif
  90.  
  91.     int n;
  92.     cin >> n;
  93.     forn(i, n) cin >> a[i];
  94.     node *t = new node(0, n-1, a);
  95.     cerr << "built @" << clock()/1000 << " ms" << endl;
  96.     int m;
  97.     cin >> m;
  98.     int ss = 0;
  99.     forn(i, m) {
  100.         int l, r, x;
  101.         cin >> l >> r >> x;
  102.         int a = t->get(l, r, x);
  103.         ss += a;
  104.     }
  105.     cout << ss << endl;
  106.     cout << "cnt = " << cnt << endl;
  107.  
  108. #ifdef HOME
  109.     cerr << "Time elapsed: " << clock() / 1000 << " ms" << endl;
  110. #endif
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement