线下蒟蒻由于被i题整红温导致措施写主席树的机会
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int a[maxn],bb[maxn],root[maxn],sz;
int r[maxn],t[maxn];
struct tree
{
int l,r,cnt,sum,val;
}tr[maxn<<5];
void build(int& now,int l,int r)
{
++sz;
now=sz;
tr[now].sum=tr[now].cnt=tr[now].val=0;
if(l==r) return ;
int mid=(l+r)>>1;
build(tr[now].l,l,mid);
build(tr[now].r,mid+1,r);
}
void modify(int& now,int pre,int l,int r,int p,int val)
{
++sz;
now=sz;
tr[now]=tr[pre];
tr[now].cnt++;
tr[now].sum+=val;
if(l==r)
{
tr[now].val=val;
return ;
}
int mid=(l+r)>>1;
if(p<=mid) modify(tr[now].l,tr[pre].l,l,mid,p,val);
else modify(tr[now].r,tr[pre].r,mid+1,r,p,val);
}
int query(int now,int pre,int l,int r,int k)
{
if(l==r) return tr[now].val*k;
int mid=(l+r)>>1;
int tmp=tr[tr[now].r].cnt-tr[tr[pre].r].cnt;
if(tmp>=k) return query(tr[now].r,tr[pre].r,mid+1,r,k);
else return query(tr[now].l,tr[pre].l,l,mid,k-tmp)+tr[tr[now].r].sum-tr[tr[pre].r].sum;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,b,ra,rb;
cin>>n>>b>>ra>>rb;
for(int i=1;i<=n;i++)
{
cin>>a[i];
bb[i]=a[i];
}
sort(bb+1,bb+1+n);
int num=unique(bb+1,bb+1+n)-bb-1;
build(root[0],1,num);
for(int i=1;i<=n;i++)
{
int flag=lower_bound(bb+1,bb+1+num,a[i])-bb;
modify(root[i],root[i-1],1,num,flag,a[i]);
}
for(int i=1;i<=n;i++)
{
if(i<=rb) r[i]=r[i-1]+a[i];
else if(i>rb&&i<=ra) r[i]=query(root[i],root[0],1,num,rb);
else r[i]=query(root[i],root[i-ra],1,num,rb);
}
for(int i=1;i<=n;i++)
{
if(i<=b) t[i]=t[i-1]+a[i];
else t[i]=query(root[i],root[0],1,num,b);
}
int ans=-1e15;
for(int i=1;i<=n;i++) ans=max(ans,t[i]+r[i]);
cout<<ans<<endl;
return 0;
}