Guest User

Number of elements <x, segtree from bottom

a guest
Dec 1st, 2015
2,065
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 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. const int sz = 1<<17;
  31.  
  32. vi rmq[sz * 2];
  33. int a[sz];
  34.  
  35. int get(int l, int r, int x) {
  36.     int s = 0;
  37.     l += sz;
  38.     r += sz;
  39.     while (l < r) {
  40.         if (l%2 == 1) s += lower_bound(all(rmq[l]), x) - rmq[l].begin();
  41.         if (r%2 == 0) s += lower_bound(all(rmq[r]), x) - rmq[r].begin();
  42.         l = (l+1) / 2;
  43.         r = (r-1) / 2;
  44.     }
  45.     if (l == r) s += lower_bound(all(rmq[l]), x) - rmq[l].begin();
  46.     return s;
  47. }
  48.  
  49. int main() {
  50. #ifdef HOME
  51.     freopen("input.txt", "r", stdin);
  52. #endif
  53.  
  54.     int n;
  55.     cin >> n;
  56.     forn(i, n) cin >> a[i];
  57.     forn(i, n) rmq[i+sz] = {a[i]};
  58.     ford(i, sz) if (i) {
  59.         rmq[i].resize(rmq[i*2].size() + rmq[i*2+1].size());
  60.         merge(all(rmq[i*2]), all(rmq[i*2+1]), rmq[i].begin());
  61.     }
  62.     cerr << "built @" << clock()/1000 << " ms" << endl;
  63.     int m;
  64.     cin >> m;
  65.     int s = 0;
  66.     forn(i, m) {
  67.         int l, r, x;
  68.         cin >> l >> r >> x;
  69.         int a = get(l, r, x);
  70.         s += a;
  71.     }
  72.     cout << s << endl;
  73.  
  74. #ifdef HOME
  75.     cerr << "Time elapsed: " << clock() / 1000 << " ms" << endl;
  76. #endif
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment