Problem:
Score : 500 points

Problem Statement

We have N bulbs arranged on a number line, numbered 1 to N from left to right.
Bulb i is at coordinate i.

Each bulb has a non-negative integer parameter called intensity.
When there is a bulb of intensity d at coordinate x, the bulb illuminates the segment from coordinate x-d-0.5 to x+d+0.5.
Initially, the intensity of Bulb i is A_i. We will now do the following operation K times in a row:

For each integer i between 1 and N (inclusive), let B_i be the number of bulbs illuminating coordinate i. Then, change the intensity of each bulb i to B_i.

Find the intensity of each bulb after the K operations.

Constraints

1 \leq N \leq 2 \times 10^5

1 \leq K \leq 2 \times 10^5

0 \leq A_i \leq N

Input

Input is given from Standard Input in the following format:

N K
A_1 A_2 \ldots A_N

Output

Print the intensity A{'}_i of each bulb i after the K operations to Standard Output in the following format:

A{'}_1 A{'}_2 \ldots A{'}_N

Sample Input 1

5 1
1 0 0 1 0

Sample Output 1

1 2 2 1 2

Initially, only Bulb 1 illuminates coordinate 1, so the intensity of Bulb 1 becomes 1 after the operation.
Similarly, the bulbs initially illuminating coordinate 2 are Bulb 1 and 2, so the intensity of Bulb 2 becomes 2.

Sample Input 2

5 2
1 0 0 1 0

Sample Output 2

3 3 4 4 3

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pii;
#define mp make_pair
#define fi first
#define se second
#define All(x) (x).begin(),(x).end()
#define Y1 "YES"
#define N1 "NO"
#define ENDL '\n'
#define count2(x) _builtin_popcount(x)
ll num[300000];
ll ans[300000];
const int maxn=300010;
struct SegmentTree{
	int l,r;
	ll sum,add;
	#define L(x) Tree[x].l
	#define R(x) Tree[x].r
	#define sum(x) Tree[x].sum
	#define add(x) Tree[x].add
}Tree[4*maxn];
void spread(int p){
	if(add(p)){
		sum(p*2)+=add(p)*(R(p*2)-L(p*2)+1);
		sum(p*2+1)+=add(p)*(R(p*2+1)-L(p*2+1)+1);
		add(p*2)+=add(p);
		add(p*2+1)+=add(p);
		add(p)=0;
	}
}
void build(int p,int l,int r){
	L(p)=l,R(p)=r; 
	if(l==r){
		sum(p)=num[l];return;
	}
	int mid =(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	sum(p)=sum(p*2)+sum(p*2+1);
}
void change(int p,int l,int r,int d){
	if(l<=L(p)&&r>=R(p)){
		sum(p)+=(ll)d*(R(p)-L(p)+1);
		add(p)+=d;
		return ;
	}
	spread(p);
	int mid =(L(p)+R(p))/2;
	ll val =0;
	if(l<=mid) change(p*2,l,r,d);
	if(r>mid)change(p*2+1,l,r,d);
	sum(p)=sum(p*2)+sum(p*2+1);
}

ll ask(int p,int l,int r){
	if(l<=L(p)&&r>=R(p))return sum(p);
	spread(p);
	int mid =(L(p)+R(p))/2;
	ll val =0;
	if(l<=mid) val+=ask(p*2,l,r);
	if(r>mid)val+=ask(p*2+1,l,r);
	return val;
}
int main(){
	ios::sync_with_stdio(0);
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;++i)
	cin>>num[i];
	build(1,1,n);
	for(int i=1;i<=n;++i){
		int l=i-1;
		int r=n-i;
		int t=ask(1,i,i);
		if(t>0){
			if(i+k<=n)
			change(1,i+k,min(i+k+t-1,n),1);
			if(i-k>=1)
			change(1,max(i-k-t+1,1),i-k,1);
		}
		change(1,i,i,min(k-1,l)+min(k-1,r));
	}
	for(int i=1;i<=n;++i)
	cout<<ask(1,i,i)<<" ";
	return 0;
}
/*
4 1
0 0 0 0
1 1 1 1
4 1
1 0 0 0
1 2 1 1
4 1
0 0 0 1
1 1 2 1
4 1
4 0 0 0
1 2 2 2
*/