rt
//P5459
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, lg = 25;
const long long R = 1e10 + 10;
long long l, r, sum[N], ans;
int n;
struct Node{ int l, r; long long sum; } T[N*lg*4]; int rt, cnt;
void update(int p){ T[p].sum = T[T[p].l].sum + T[T[p].r].sum; }
void modify(int &p, long long pos, long long val, long long l = -R, long long r = R){
if(!p) p = ++ cnt;
if(l == r){ T[p].sum += val; return; }
long long mid = l + r >> 1;
if(pos <= mid) modify(T[p].l, pos, val, l, mid);
else modify(T[p].r, pos, val, mid + 1, r);
update(p);
}
long long query(int &p, long long ql, long long qr, long long l = -R, long long r = R){
if(!p) p = ++ cnt;
if(ql <= l && r <= qr) return T[p].sum;
long long res = 0, mid = l + r >> 1;
if(ql <= mid) res += query(T[p].l, ql, qr, l, mid);
if(mid < qr) res += query(T[p].r, ql, qr, mid + 1, r);
return res;
}
int main(){
scanf("%d%lld%lld", &n, &l, &r);
for(int i = 1; i <= n; ++ i){
scanf("%lld", &sum[i]);
sum[i] += sum[i-1];
}
modify(rt, 0ll, 1ll);
for(int i = 1; i <= n; ++ i){
ans += query(rt, sum[i] - r, sum[i] - l);
modify(rt, sum[i], 1ll);
//先query再modify:100pts
//先modify再query:80pts
}
printf("%lld\n", ans);
return 0;
}
为什么?