Problem: A positive integer x is called a power of two if it can be represented as x = 2^y, where y is a non-negative integer. So, the powers of two are 1, 2, 4, 8, 16, ....

You are given two positive integers n and k. Your task is to represent n as the sum of exactly k powers of two.

Input

The only line of the input contains two integers n and k (1 ≤ n ≤ 10^9, 1 ≤ k ≤ 2 ⋅ 10^5).

Output

If it is impossible to represent n as the sum of k powers of two, print NO.

Otherwise, print YES, and then print k positive integers b_1, b_2, ..., b_k such that each of b_i is a power of two, and ∑ _{i = 1}^{k} b_i = n. If there are multiple answers, you may print any of them.

Examples

Input


9 4


Output


YES
1 2 2 4 


Input


8 1


Output


YES
8 


Input


5 1


Output


NO


Input


3 7


Output


NO

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;

public class Makise {
	static PrintWriter out=new PrintWriter(System.out);

	public static void main(String[] args) throws Exception{
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int k=sc.nextInt();
		Queue<Long> q=new LinkedList<>();
		HashMap<Long ,Long> hm=new HashMap<>();
		for(int i=0;i<32;i++) {
			if((1<<i&n)!=0) {
				long h=(long)(Math.pow(2,i));
				q.add(h);
				hm.put(h, hm.getOrDefault(h,0l)+1);

			}
		}
		if(q.size()==k) {
			out.println("YES");
			while(!q.isEmpty()) {
				out.print(q.remove()+" ");
			}}
		else if (q.size()>k) {
			out.println("NO");
		}
		else {
			int size=q.size();
			while(q.size()!=k) {
				Long num=q.remove();
				hm.put(num, hm.get(num)-1);
				if (num!=1) {
					num=num/2;
					q.add(num);
					q.add(num);
					hm.put(num, hm.getOrDefault(num,0l)+2);
				}
				else {
					q.add(num);
					hm.put(num, hm.getOrDefault(num,0l)+1);

					if (!canhappen(hm,k)) {
						out.println("NO");
						out.flush();
						return;
					}
				}
			}
			out.println("YES");
			while(!q.isEmpty()) {
				out.print(q.remove()+" ");
			}

		}
		out.flush();

	}
	static boolean canhappen(HashMap<Long,Long> hm,int k) {
		int size=0;
		int size2=0;
		for (Long key:hm.keySet()) {
			if (key!=1) {
				size+=hm.get(key);
			}

		}
		size2+=hm.getOrDefault(1, 0l);
		return size==0&&size2!=k? false:true;
	}
	static class o implements  Comparable<o>{
		int val,id;
		boolean used;
		o(int v,int i){
			val=v;
			id=i;

		}
		@Override
		public int compareTo(o o) {
			return o.val!=val?o.val-val:used?1:-1;
		}
		public String toString(){
			return this.val+" "+id+",";
		}
	}


	static class UnionFind {                                              
		int[] p, rank, setSize;
		int numSets;

		public UnionFind(int N) 
		{
			p = new int[numSets = N];
			rank = new int[N];
			setSize = new int[N];
			for (int i = 0; i < N; i++) {  p[i] = i; setSize[i] = 1; }
		}

		public int findSet(int i) { return p[i] == i ? i : (p[i] = findSet(p[i])); }

		public boolean isSameSet(int i, int j) { return findSet(i) == findSet(j); }

		public void unionSet(int i, int j) 
		{ 
			if (isSameSet(i, j)) 
				return;
			numSets--; 
			int x = findSet(i), y = findSet(j);
			if(rank[x] > rank[y]) { p[y] = x; setSize[x] += setSize[y]; }
			else
			{	p[x] = y; setSize[y] += setSize[x];
			if(rank[x] == rank[y]) rank[y]++; 
			} 
		}

		public int numDisjointSets() { return numSets; }

		public int sizeOfSet(int i) { return setSize[findSet(i)]; }
	}

	static class Scanner{
		StringTokenizer st;
		BufferedReader br;
		public Scanner(InputStream system) { br = new BufferedReader(new InputStreamReader(system));}
		public Scanner(String file) throws Exception{br = new BufferedReader(new FileReader (file));}
		public String next() throws IOException{
			while (st==null|| !st.hasMoreTokens()) st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}
		public int nextInt() throws IOException{
			return Integer.parseInt(next());
		}
		public long nextLong() throws IOException{
			return Long.parseLong(next());
		}
		public String nextLine() throws IOException{
			return br.readLine();
		}
		public Double nextDouble() throws IOException{
			return Double.parseDouble(next());
		}

	}
}