#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
ll c, n, k, f[N], g[N], s[N], ans[N];
struct node{
ll v, id;
}a[N];
bool cmp(node x, node y){
return x.v < y.v;
}
int main(){
cin >> c >> n >> k;
for (int i = 1; i <= n; i++){
cin >> a[i].v;
a[i].id = i;
}
sort(a + 1, a + n + 1, cmp);
//先排个序
ll tag, cnt = 1, tmpcnt = 1;
for (int i = 1; i <= n; i++)
s[i] = s[i-1] + a[i].v;
//前缀和
for (int i = n; i >= 1; i--){
if (a[i].v != a[i+1].v){
cnt += tmpcnt;
tmpcnt = 1;
if (cnt == k){
tag = a[i].v;
break;
}else if (cnt > k){
tag = a[i+1].v;
break;
}
}else ++tmpcnt;
}//如果要排名第K,需要达到的值
a[n+1].v = 2000000000;
for (int i = 1; i <= n; i++){
int pos1 = upper_bound(a+1, a+n+1, a[i], cmp)-a;
f[i] = n - pos1 + 2;//当前f[i]
int pos2 = lower_bound(a+1, a+n+1, a[i], cmp)-a;
g[i] = n - pos2 + 1;//当前g[i]
if (g[i] < k)
ans[a[i].id] = (k-g[i])*a[pos2].v - (s[pos2-1]-s[pos2-(k-g[i])-1]);
//让所有比i小的数中最大的k-g[i]个等于a[i]
else if (f[i] > k)
ans[a[i].id] = tag - a[pos1-1].v;
//让值加到tag
}
//f[i]小于等于g[i],所以其中一个达到k后就不管另一个
for (int i = 1; i <= n; i++)
cout << ans[i] << endl;
return 0;
}
帮助者必关