代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,k,l,r,a[500002],m,cnt;
long long f[500002],e[500002],g[500002],root[500002],b[500002],ans;
priority_queue<pair<long long,int> >q;
struct node{
int l,r,cnt;
}t[20000001];
bool v[500001];
int build(int l,int r){
int p=++cnt;
if(l==r)return p;
int mid=(l+r)>>1;
t[p].l=build(l,mid);
t[p].r=build(mid+1,r);
return p;
}
int change(int now,int l,int r,int x){
int p=++cnt;
t[p]=t[now];
if(l==r){
t[p].cnt++;
return p;
}
int mid=(l+r)>>1;
if(x<=mid)t[p].l=change(t[now].l,l,mid,x);
else t[p].r=change(t[now].r,mid+1,r,x);
t[p].cnt=t[t[p].l].cnt+t[t[p].r].cnt;
return p;
}
int ask(int p,int q,int l,int r,int k){
if(l==r)return l;
int mid=(l+r)>>1;
int lcnt=t[t[p].l].cnt-t[t[q].l].cnt;
if(k<=lcnt)return ask(t[p].l,t[q].l,l,mid,k);
else return ask(t[p].r,t[q].r,mid+1,r,k-lcnt);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>k>>l>>r;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=f[i-1]+a[i];
e[i]=f[i];
b[i]=1;
}
sort(e+1,e+1+n);
for(int i=1;i<=n;i++){
if(i==1||e[i]!=e[i-1])g[++m]=e[i];
}
sort(g+1,g+1+m);
root[0]=build(1,m);
for(int i=1;i<=n;i++){
int t=lower_bound(g+1,g+1+m,f[i])-g;
root[i]=change(root[i-1],1,m,t);
}
for(int i=l;i<=n;i++){
int ll=max(i-r,1),rr=i-l;
if(i-r<=0&&g[ask(root[rr],root[0],1,m,1)]>0)q.push(make_pair(f[i],i)),v[i]=1,b[i]=0;
else q.push(make_pair(f[i]-g[ask(root[rr],root[ll-1],1,m,1)],i));
}
for(int i=1;i<=k;i++){
pair<long long,int>w=q.top();
q.pop();
ans+=w.first;
if(w.second!=l){
b[w.second]++;
int ll=max(w.second-r,1),rr=w.second-l;
if(w.second-r<=0&&!v[w.second]&&g[ask(root[rr],root[0],1,m,b[w.second])]>0)q.push(make_pair(f[w.second],w.second)),v[w.second]=1,b[w.second]--;
else q.push(make_pair(f[w.second]-g[ask(root[rr],root[ll-1],1,m,b[w.second])],w.second));
}
}
cout<<ans;
}