动态开点的第一个区间范围对于本题的影响很奇怪
最大区间 -1e10~1e10-> AC 0~1e10-> 10pts mle前九个点
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e6+666;
const ll inf=1e10;
struct tree{
int ls,rs,lzy;
ll data;
}t[N];
int n,cnt;
ll s[N],ans,ln,rn;
inline void spread(int p,ll l,ll r){
if(!t[p].lzy)
return;
if(!t[p].ls)
t[p].ls=++cnt,t[cnt]=tree{0,0,0,0ll};
if(!t[p].rs)
t[p].rs=++cnt,t[cnt]=tree{0,0,0,0ll};
int rson=t[p].rs,lson=t[p].ls;
ll mid=l+r>>1;
t[lson].lzy+=t[p].lzy;
t[lson].data+=(mid-l+1)*t[p].lzy;
t[rson].lzy+=t[p].lzy;
t[rson].data+=(r-mid)*t[p].lzy;
t[p].lzy=0;
return;
}
inline void update(int p,ll l,ll r,int pre,ll L=-inf,ll R=inf){
if(L>=l&&R<=r){
t[p].data+=(ll)pre*(R-L+1);
t[p].lzy+=pre;
return;
}
if(L>R)
return;
spread(p,L,R);
ll mid=L+R>>1;
if(l<=mid){
if(!t[p].ls)
t[++cnt]=tree{0,0,0,0ll},t[p].ls=cnt;
update(t[p].ls,l,r,pre,L,mid);
}
if(r>mid){
if(!t[p].rs)
t[++cnt]=tree{0,0,0,0ll},t[p].rs=cnt;
update(t[p].rs,l,r,pre,mid+1,R);
}
t[p].data=t[t[p].ls].data+t[t[p].rs].data;
return;
}
inline ll query(int p,ll l,ll r,ll L=-inf,ll R=inf){
ll ans=0ll;
if(L>=l&&R<=r)
return t[p].data;
if(L>R)
return 0ll;
spread(p,L,R);
ll mid=L+R>>1;
if(l<=mid){
if(!t[p].ls)
t[p].ls=++cnt,t[cnt]=tree{0,0,0,0ll};
ans+=query(t[p].ls,l,r,L,mid);
}
if(r>mid){
if(!t[p].rs)
t[p].rs=++cnt,t[cnt]=tree{0,0,0,0ll};
ans+=query(t[p].rs,l,r,mid+1,R);
}
return ans;
}
int main(){
int x;
scanf("%d%lld%lld",&n,&ln,&rn);
for(int i=1;i<=n;++i){
scanf("%d",&x);
s[i]=s[i-1]+x;
}
t[++cnt]=tree{0,0,0,0ll};
update(1,0ll,0ll,1);
for(int i=1;i<=n;++i){
ans+=query(1,s[i]-rn,s[i]-ln);
update(1,s[i],s[i],1);
}
printf("%lld",ans);
return 0;
}