线下蒟蒻由于被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;
 }