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 Rust (1.42.0) (judge verdict: Accepted)

#[allow(unused_imports)]
use proconio::{input, marker::*};

#[allow(unused_imports)]
use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque};

#[allow(unused_imports)]
use std::io::Write;

#[allow(unused_macros)]
macro_rules! debug {
    ($($a:expr),*) => {
        #[cfg(debug_assertions)]
        writeln!(&mut std::io::stderr(), concat!("[DEBUG] ", $(stringify!($a), "={:?} "),*), $($a),*).unwrap();
    }
}

struct BinaryIndexedTree {
    tree: Vec<isize>,
}
impl BinaryIndexedTree {
    #[allow(dead_code)]
    fn new(n: usize) -> Self {
        BinaryIndexedTree {
            tree: vec![0; n + 1],
        }
    }
    #[allow(dead_code)]
    fn add(&mut self, a: usize, w: isize) {
        let mut x = a as isize + 1;
        while x < self.tree.len() as isize {
            self.tree[x as usize] += w;
            x += x & (-x);
        }
    }
    #[allow(dead_code)]
    fn sum(&self, n: usize) -> isize {
        let mut x = n as isize;
        let mut ret = 0;
        while x > 0 {
            ret += self.tree[x as usize];
            x -= x & (-x);
        }
        ret
    }
    #[allow(dead_code)]
    fn sum_with(&self, l: usize, r: usize) -> isize {
        if l == 0 {
            self.sum(r)
        } else {
            self.sum(r) - self.sum(l - 1)
        }
    }
}

macro_rules ! max { ( $ x : expr ) => ( $ x ) ; ( $ x : expr , $ ( $ z : expr ) ,+ ) => { { std :: cmp :: max ( $ x , max ! ( $ ( $ z ) ,* ) ) } } }
macro_rules ! min { ( $ x : expr ) => ( $ x ) ; ( $ x : expr , $ ( $ z : expr ) ,+ ) => { { std :: cmp :: min ( $ x , min ! ( $ ( $ z ) ,* ) ) } } }

fn main() {
    input! {
        n: usize,
        k: usize,
        mut a: [isize;n],
    }

    for _ in 0..k {
        let mut bit = BinaryIndexedTree::new(n);
        for i in 0..n {
            bit.add(max!(i as isize - a[i], 0) as usize, 1);
            bit.add(min!(i as isize + a[i] + 1, n as isize) as usize, -1);
        }
        let mut flag = false;
        for i in 0..n {
            a[i] = bit.sum(i + 1);
            if a[i] < n as isize {
                flag = true;
            }
        }
        if !flag {
            break;
        }
    }
    for i in 0..n {
        print!("{} ", a[i]);
    }
    println!("");
}