fork(1) download
  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <iterator>
  5. using namespace std;
  6.  
  7.  
  8. class SegmentTree {
  9.  
  10. int sz;
  11. vector< vector<int> > t;
  12.  
  13. void build(int v, int vl, int vr, const vector<int> &a) {
  14. if (vl == vr) {
  15. t[v].push_back(a[vl]);
  16. return;
  17. }
  18. int vm = vl + (vr - vl) / 2;
  19. build(2 * v + 1, vl, vm, a);
  20. build(2 * v + 2, vm + 1, vr, a);
  21. merge(t[2 * v + 1].begin(), t[2 * v + 1].end(), t[2 * v + 2].begin(), t[2 * v + 2].end(), back_inserter(t[v]));
  22. }
  23.  
  24. int query(int v, int vl, int vr, int l, int r, int k) const {
  25. if (r < vl || vr < l)
  26. return 0;
  27. if (l <= vl && vr <= r)
  28. return t[v].end() - upper_bound(t[v].begin(), t[v].end(), k);
  29. int vm = vl + (vr - vl) / 2;
  30. int ql = query(2 * v + 1, vl, vm, l, r, k);
  31. int qr = query(2 * v + 2, vm + 1, vr, l, r, k);
  32. return ql + qr;
  33. }
  34.  
  35. public:
  36.  
  37. SegmentTree(const vector<int> &a) {
  38. sz = a.size();
  39. t.resize(4 * sz);
  40. build(0, 0, sz - 1, a);
  41. }
  42.  
  43. int query(int l, int r, int k) const {
  44. return query(0, 0, sz - 1, l, r, k);
  45. }
  46.  
  47. };
  48.  
  49.  
  50. int main() {
  51. int aSize;
  52. scanf("%d", &aSize);
  53.  
  54. vector<int> a(aSize);
  55. for (int i = 0; i < aSize; i++)
  56. scanf("%d", &a[i]);
  57.  
  58. SegmentTree st(a);
  59.  
  60. int queriesCount;
  61. scanf("%d", &queriesCount);
  62.  
  63. for (int i = 0; i < queriesCount; i++) {
  64. int l, r, k;
  65. scanf("%d%d%d", &l, &r, &k);
  66. printf("%d\n", st.query(l - 1, r - 1, k));
  67. }
  68. }
Success #stdin #stdout 0s 3484KB
stdin
5
5 1 2 3 4
3
2 4 1
4 4 4
1 5 2 
stdout
2
0
3