# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1230445 | warrenn | Vudu (COCI15_vudu) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,p;
int a[1000002];
int b[1000002];
int pref[1000002];
map<int,int>conv;
int cnt=1;
vector<int>tmp,st;
void update(int idx,int l,int r,int pos,int val){
if(l==r){
st[idx]+=val;
return ;
}
int mid=(l+r)/2;
if(pos<=mid)update(2*idx,l,mid,pos,val);
else update(2*idx+1,mid+1,r,pos,val);
st[idx]=st[2*idx]+st[2*idx+1];
}
int query(int idx,int l,int r,int posl,int posr){
if(l>=posl && r<=posr)return st[idx];
if(l>posr || r<posl)return 0;
int mid=(l+r)/2;
return query(2*idx,l,mid,posl,posr)+query(2*idx+1,mid+1,r,posl,posr);
}
int conv(int hah){
int idx=lower_bound(tmp.begin(),tmp.end(),hah)-tmp.begin();
return idx+1;
}
signed main(){
cin>>n;
for(int q=1;q<=n;q++){
cin>>a[q];
}
cin>>p;
for(int q=1;q<=n;q++){
pref[q]=pref[q-1]+a[q];
b[q]=pref[q]-p*q;
tmp.push_back(b[q]);
}
tmp.push_back(0);
sort(tmp.begin(),tmp.end());
tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());
st=vector<int>(4*cnt+1,0);
int ans=0;
update(1,1,cnt,conv(0),1);
for(int q=1;q<=n;q++){
ans+=query(1,1,cnt,1,conv(b[q]));
// cout<<ans<<" "<<conv[b[q]]<<endl;
update(1,1,cnt,conv(b[q]),1);
}
cout<<ans<<endl;
}