Pagini recente » Cod sursa (job #212902) | Cod sursa (job #1137560) | Cod sursa (job #423065) | Cod sursa (job #578048) | Cod sursa (job #163576)
Cod sursa(job #163576)
#include <cstdio>
const int N = 100000;
int n,m,k,len,tot;
int d[N];
int r[N];
inline int min ( int a, int b ) { return (a < b) ? a : b; }
int main() {
freopen("progresii.in","rt",stdin);
freopen("progresii.out","wt",stdout);
scanf("%d %d %d %d",&n,&m,&k,&len);
tot = 0;
for (int i = 0,p; i < n; ++i) {
scanf("%d",&p);
d[i] = len-p+1;
tot += d[i];
}
for (int i = n-1; i >= 0; --i) {
r[i] = 1;
int rem = tot - d[i], left, right;
for (left = 0, right = min(m-1,d[i]-1); right - left > 1; ) {
// In the middle of the night
// I go walking in my sleep
int mid = (left+right)/2;
// And i'm searching for something
if (rem + (1 + (d[i] - 1) / mid) > k) {
left = mid;
} else {
right = mid;
}
}
if (rem + (1 + (d[i] - 1) / (left + 1)) <= k)
r[i] = left+1; else
r[i] = right+1;
tot -= d[i];
tot += (1 + (d[i] - 1) / r[i]);
}
if (tot > k) {
printf("-1\n");
return 0;
}
// Basarabie frumoasa
// Pregateste-te mireasa
// Ca-ti aducem petitor
// Sfantul nostru tricolor
for (int i = 0; i < n; ++i) printf("%d\n",r[i]);
return 0;
}