← Home
package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
)

var left, right []int

func newNode() int {
	left = append(left, 0)
	right = append(right, 0)
	return len(left) - 1
}

func isPow2(x int) bool {
	return x > 0 && (x&(x-1)) == 0
}

func feasible(L, k int) bool {
	if L < 1 || k < 0 {
		return false
	}
	if L == 1 {
		return k == 0
	}
	if k > L-2 {
		return false
	}
	if isPow2(L) {
		return k == 0 || k >= 2
	}
	if L == 5 {
		return k == 1 || k == 3
	}
	return k >= 1
}

func buildPerfect(L int) int {
	if L == 1 {
		return newNode()
	}
	r := newNode()
	left[r] = buildPerfect(L / 2)
	right[r] = buildPerfect(L / 2)
	return r
}

func buildExactOne(L int) int {
	if L < 3 || isPow2(L) {
		return 0
	}
	p := 1 << (bits.Len(uint(L)) - 1)
	if p == L {
		return 0
	}
	rem := L - p
	r := newNode()
	if rem == p/2 {
		left[r] = buildPerfect(p / 2)
		right[r] = buildPerfect(p)
	} else if rem < p/2 {
		left[r] = buildPerfect(p / 2)
		right[r] = buildExactOne(L - p/2)
	} else {
		left[r] = buildPerfect(p)
		right[r] = buildExactOne(rem)
	}
	if left[r] == 0 || right[r] == 0 {
		return 0
	}
	return r
}

func build(L, k int) int {
	if k == 0 {
		return buildPerfect(L)
	}
	if k == 1 {
		return buildExactOne(L)
	}
	root, prev := 0, 0
	for k > 1 {
		cur := newNode()
		if root == 0 {
			root = cur
		} else {
			right[prev] = cur
		}
		if feasible(L-1, k-1) {
			left[cur] = newNode()
			L--
		} else if L >= 6 && feasible(L-2, k-1) {
			left[cur] = buildPerfect(2)
			L -= 2
		} else {
			return 0
		}
		k--
		prev = cur
	}
	sub := buildExactOne(L)
	if sub == 0 {
		return 0
	}
	if root == 0 {
		return sub
	}
	right[prev] = sub
	return root
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var n, k int
	fmt.Fscan(in, &n, &k)

	if n%2 == 0 {
		fmt.Fprintln(out, "NO")
		return
	}

	L := (n + 1) / 2
	if !feasible(L, k) {
		fmt.Fprintln(out, "NO")
		return
	}

	left = make([]int, 1, n+1)
	right = make([]int, 1, n+1)

	root := build(L, k)
	if root == 0 || len(left)-1 != n {
		fmt.Fprintln(out, "NO")
		return
	}

	s := make([]int, n+1)
	stack := []int{root}
	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		if left[v] != 0 {
			s[left[v]] = v
			stack = append(stack, left[v])
		}
		if right[v] != 0 {
			s[right[v]] = v
			stack = append(stack, right[v])
		}
	}

	fmt.Fprintln(out, "YES")
	for i := 1; i <= n; i++ {
		if i > 1 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, s[i])
	}
	fmt.Fprintln(out)
}