思考后发现可以贪心,类似哈夫曼树,直接开一个multiset,每次取出最小值和最大值即可。

int n,k;
ll m;
multiset <ll> s;

void solve(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) {
		ll x;cin>>x;
		s.insert(x);
	}
	
	while(k--){
		ll x=*s.begin();
        s.erase(s.find(x));
        s.insert(x+m);
		ll y=*(--s.end());
        s.erase(s.find(y));
        s.insert(y-m);
	}
	
	ll ans=1;
	for(auto i:s){
		ans=ans*i%mod;
	}
	cout<<ans<<endl;
}