Загрузка данных


import sys

def solve():
    # Чтение всех данных из стандартного потока ввода
    input = sys.stdin.read
    data = input().split()
    if not data:
        return
    
    n = int(data[0])
    k = int(data[1])
    
    # Список сумм s_0, s_1, ..., s_{n-k}
    s = [int(x) for x in data[2:2 + n - k + 1]]
    
    # Массивы для определения ограничений на первые k элементов
    # fixed[r] будет хранить обязательное значение (0 или 1), если оно зафиксировано, иначе -1
    fixed = [-1] * k
    
    # delta[i][r] показывает разность между x_{i*k + r} и x_r
    # Будем вычислять её последовательно шаг за шагом
    current_delta = [0] * k
    
    # Проходим по всем окнам и смотрим, как меняются элементы при сдвиге на k
    for i in range(n - k):
        diff = s[i+1] - s[i]
        r = i % k
        # x_{i+k} = x_i + diff
        # Следовательно, новая дельта относительно x_r увеличивается на diff
        current_delta[r] += diff
        
        # Индекс целевого элемента
        target_idx = i + k
        target_r = target_idx % k
        
        # Проверяем ограничения на значение x_r
        if current_delta[target_r] == 1:
            fixed[target_r] = 0
        elif current_delta[target_r] == -1:
            fixed[target_r] = 1

    # Посчитаем, сколько единиц уже ЖЕСТКО зафиксировано в первом окне
    fixed_ones = 0
    for r in range(k):
        if fixed[r] == 1:
            fixed_ones += 1
            
    # Сколько еще единиц нам ОСТАЛОСЬ распределить, чтобы сумма первого окна была равна s[0]
    rem_ones = s[0] - fixed_ones
    
    # Формируем первые k элементов (первое окно)
    # Чтобы строка была лексикографически минимальной, мы хотим распределить оставшиеся единицы
    # как можно дальше вправо (на самые большие индексы r)
    x = [0] * k
    for r in range(k):
        if fixed[r] != -1:
            x[r] = fixed[r]
        else:
            # Свободное место. Смотрим, нужно ли нам поставить тут 0 или 1.
            # Нам выгодно ставить 0. Ставим 1 только если количество оставшихся свободных мест 
            # справа (включая текущее) в точности равно количеству оставшихся единиц rem_ones.
            free_slots_left = 0
            for j in range(r, k):
                if fixed[j] == -1:
                    free_slots_left += 1
            
            if free_slots_left == rem_ones:
                x[r] = 1
                rem_ones -= 1
            else:
                x[r] = 0

    # Теперь, зная первые k элементов, восстанавливаем всю строку длины n
    ans = [0] * n
    for r in range(k):
        ans[r] = x[r]
        
    current_delta = [0] * k
    for i in range(n - k):
        diff = s[i+1] - s[i]
        r = i % k
        current_delta[r] += diff
        
        target_idx = i + k
        target_r = target_idx % k
        ans[target_idx] = x[target_r] + current_delta[target_r]
        
    # Выводим результат в виде бинарной строки
    print("".join(map(str, ans)))

if __name__ == '__main__':
    solve()