#include<bits/stdc++.h>
using namespace std;
const long long N=1e5+5;
long long t[N];
long long a[N],b[N],L,R,n;
inline int lowbit(int x){return x&-x;}
inline int query(int x){
int ans=0;
while(x){
ans+=t[x];
x-=lowbit(x);
}
return ans;
}
inline void add(int x){
while(x<=n){
t[x]++;
x+=lowbit(x);
}
}
int main(){
long long ans=0;
cin>>n>>L>>R;
for(int i=1;i<=n;i++) cin>>a[i],a[i]+=a[i-1],b[i]=a[i];
sort(b+1,b+2+n);
add(lower_bound(b+1,b+n+1,0)-b);//1
for(int i=1;i<=n;i++){
int l=lower_bound(b+1,b+1+n,a[i]-R)-b-1,
r=upper_bound(b+1,b+1+n,a[i]-L)-b-1;
ans+=query(r)-query(l);//2
add(lower_bound(b+1,b+1+n,a[i])-b);//3
}
cout<<ans;
return 0;
}
1.为什么要在-1处加1?
2.求区间和的话为什么不是“-query(l-1)”?
3.“lower_bound(b+1,b+1+n,a[i])-b-1”不是才表示a[i]是第几个大的吗?这和上面“sort(b+1,b+2+n)”在前面加个0有什么关系?