求助大佬
#include<bits/stdc++.h>
using namespace std;
int n;
long long a[1005];
long long smax[1005][20];
void ST()
{
for(int i=1;i<=n;i++)
{
smax[i][0]=i;
}
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
int x=smax[i][j-1],y=smax[i+(1<<(j-1))][j-1];
smax[i][j]=a[x]>a[y]?x:y;
}
}
}
int query(int l,int r)
{
int k=log2(r-l+1);
int x=smax[l][k],y=smax[r-(1<<k)+1][k];
return a[x]>a[y]?x:y;
}
class Node
{
public:
int o,l,r,t;
long long data;
Node()
{
}
Node(int o,int l,int r)
{
this->o=o;
this->l=l;
this->r=r;
this->t=query(l,r);
this->data=a[t]-a[o-1];
}
friend bool operator<(const Node&o1,const Node&o2)
{
return a[o1.t]-a[o1.o-1]<a[o2.t]-a[o2.o-1];
}
};
int main()
{
int k,L,R;
cin>>n>>k>>L>>R;
a[0]=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1];
}
ST();
priority_queue<Node> prq;
for(int i=1;i<=n;++i)
{
if(i+L-1<=n)
{
Node no(i,i+L-1,min(i+R-1,n));
prq.push(no);
}
}
long long ans = 0;
while(k--)
{
Node no=prq.top();
int o=no.o;
int r=no.r;
int l=no.l;
int t=no.t;
ans+=no.data;
prq.pop();
if(t!=l)
{
Node nn(o,l,t-1);
prq.push(nn);
}
if(t!=r)
{
Node nn(o,t+1,r);
prq.push(nn);
}
}
cout<<ans;
return 0;
}