可能是 find 写挂了?调不出来了/kel
#include <bits/stdc++.h>
using namespace std;
const int maxn=5*1e5+5;
int n,k,L,R,a[maxn],sum[maxn],g[maxn][25],f[maxn][25];
// l到r的区间最大值
int rmq(int l,int r)
{
int s=log2(r-l+1);
return max(f[l][s],f[r-(1<<s)+1][s]);
}
struct node
{
int u,l,r,val;
friend bool operator < (node a,node b)
{
return a.val<b.val;
}
}pi[maxn];
priority_queue<node> q;
int find (int l,int r)
{
int t=log2(r-l+1);
return f[l][t]>f[r-(1<<t)+1][t]?g[l][t]:g[r-(1<<t)+1][t];
}
int main()
{
cin>>n>>k>>L>>R;
for(int i=1;i<=n;i++)
cin>>a[i],sum[i]=sum[i-1]+a[i];
for(int i=1;i<=n;i++)
{
if(i+L-1>n) break;
for(int j=i+L;j<=min(i+R,n);j++) f[j][0]=sum[j]-sum[i-1]/*,cout<<f[j][0]*/;
q.push(node{i,L,R,rmq(i+L,i+R)});
}
for(int j=1;j<=20;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
int ans;
//cout<<find(10,100)<<"qwq"<<endl;
for(int i=1;i<=k;i++)
{
node tmp=q.top();q.pop();
ans+=tmp.val;
// q.push(node{tmp.u,tmp.u+L,find(tmp.u+L,tmp.u+R)-1,rmq(L,find(tmp.u+L,tmp.u+R)-1)});
//q.push({tmp.u,find(tmp.u+L,tmp.u+R)+1,tmp.u+R,rmq(find(tmp.u+L,tmp.u+R)+1,R)});
}
cout<<ans;
return 0;
}