fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10. const int N = 1e5 + 5;
  11.  
  12. int n, L, R;
  13. int a[N];
  14. ll pref[N];
  15.  
  16. struct Fenwick {
  17. int n;
  18. vector<int> ft;
  19.  
  20. Fenwick(int n) : n(n) {
  21. ft.resize(n, 0);
  22. }
  23.  
  24. void update(int pos, int val) {
  25. for (; pos >= 0; pos = (pos & (pos + 1)) - 1) {
  26. ft[pos] += val;
  27. }
  28. }
  29.  
  30. int get(int pos) {
  31. int ans = 0;
  32. for (; pos < n; pos = pos | (pos + 1)) {
  33. ans += ft[pos];
  34. }
  35. return ans;
  36. }
  37. };
  38.  
  39. ll countSum(ll X) {
  40. // sum[i + 1..j] <= X
  41. // <=> pref[j] - pref[i] <= X
  42. // <=> pref[i] >= pref[j] - X
  43.  
  44. vector<ll> vals;
  45. for (int i = 0; i <= n; i++) {
  46. vals.push_back(pref[i]);
  47. }
  48. sort(vals.begin(), vals.end());
  49. vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
  50.  
  51. Fenwick fenw(vals.size());
  52. ll ans = 0;
  53. for (int j = 0; j <= n; j++) {
  54. // Giá trị nén của pref[i] nhỏ nhất >= pref[j] - X
  55. int u = lower_bound(vals.begin(), vals.end(), pref[j] - X) - vals.begin();
  56. ans += fenw.get(u);
  57.  
  58. // Giá trị nén của pref[j]
  59. int v = lower_bound(vals.begin(), vals.end(), pref[j]) - vals.begin();
  60. fenw.update(v, 1);
  61. }
  62.  
  63. return ans;
  64. }
  65.  
  66. int main() {
  67. ios::sync_with_stdio(false);
  68. cin.tie(nullptr);
  69. cin >> n >> L >> R;
  70. for (int i = 1; i <= n; i++) cin >> a[i], pref[i] = pref[i - 1] + a[i];
  71.  
  72. ll ans = countSum(R) - countSum(L - 1);
  73.  
  74. cout << ans << '\n';
  75. }
  76.  
Success #stdin #stdout 0s 5320KB
stdin
4 2 4
1 2 3 4
stdout
4