感觉 inf 设置的够大了应该不是这个问题吧,但是哪里错了,找不出来(
CF不开放数据下载,太坏了qwq
#include <bits/stdc++.h>
#define ll __int128
using namespace std;
inline int read() {
int tmp = 0, f = 1;
char c = getchar();
while(!isdigit(c)) {
if(c == '-') f = -f;
c = getchar();
}
while(isdigit(c)) tmp = (tmp << 1) + (tmp << 3) + (c ^ 48), c = getchar();
return tmp * f;
}
inline ll readll() {
ll tmp = 0, f = 1;
char c = getchar();
while(!isdigit(c)) {
if(c == '-') f = -f;
c = getchar();
}
while(isdigit(c)) tmp = (tmp << 1) + (tmp << 3) + (c ^ 48), c = getchar();
return tmp * f;
}
void write(ll x) {
if(x > 9) write(x / 10);
putchar((x % 10) ^ 48);
}
int a[100010], n;
ll k;
inline bool check(ll fz) {
ll cnt = 0;
// cerr << fz << " ";
for(int i = 1; i <= n; i++) {
ll l = 0, r = min((ll)a[i], k), res = l;
while(l <= r) {
ll mid = (l + r) / 2;
if(a[i] - mid * mid * 3 + mid * 3 - 1 >= fz) res = mid, l = mid + 1;
else r = mid - 1;
}
// cerr << res << " " ;
cnt += res;
}
// cerr << endl;
return cnt >= k;
}
int main() {
n = read(); k = readll();
for(int i = 1; i <= n; i++) a[i] = read();
ll l = -1e30, r = 1e30, ans = r;
while(l <= r) {
ll mid = (l + r) / 2;
if(check(mid)) l = mid + 1, ans = mid;
else r = mid - 1;
}
// cerr << ans << endl;
ll cnt = 0;
for(int i = 1; i <= n; i++) {
ll l = -1, r = min((ll)a[i], k), res = l;
while(l <= r) {
ll mid = (l + r) / 2;
if(a[i] - mid * mid * 3 + mid * 3 - 1 >= ans) res = mid, l = mid + 1;
else r = mid - 1;
}
// cerr << res << endl;
write(min(res, max((ll)0, k - cnt))), putchar(' ');
cnt += res;
}
cout << endl;
return 0;
}