I. 线段树

内存限制:256 MiB 时间限制:3000 ms 标准输入输出
题目类型:传统 评测方式:Special Judge

题目描述

本题的评测时间较长,若发现有恶意利用此题堵塞评测队列的,我们会采取包括但不限于禁赛等措施

线段树是一种常见的数据结构。线段树可以在均摊的时间复杂度下进行很多区间操作,包括区间修改,区间查询,区间赋值,区间取模,区间学高数,区间挂科,区间cosplay,区间ak等等操作。

线段树有很多建树方法。以下为一种方法的伪代码:(是我们想在上面建线段树的数组,是线段树数组)

a,b是两个不同的数组
Function build(l,r,idx):
   if l equals r Then:
        {
           b[idx]=a[l]
        }
   else
        {
           mid=(l+r)/2
           使mid向下取整
           build(l,mid,idx*2)
           build(mid+1,r,idx*2+1)
           b[idx]=b[idx*2]+b[idx*2+1]
        }

我们只需要调用,就可以对数组建线段树,线段树数组为

根据上面建好的线段树,我们可以在时间复杂度内查询某个区间的和

kuro在刚学完线段树时,为这个数据结构的精妙感到惊叹,他很好奇,对于一颗线段树,树上的所有点的权值组成的集合是怎么样的呢?kuro很快知道了这个问题的答案,并决定将这个问题反过来问你:对于一个集合,是否存在一个子集,使得是一颗有个节点的线段树的所有点的权值组成的集合,并希望你能将线段树数组输出。

输入格式

第一行为两个整数使得成立,代表集合的元素数和线段树的节点数

第二行为个整数,表示集合

输出格式

第一行包含输出一行"Yes"或"No"(都不包含双引号)

"Yes"表示可以构成线段树,"No"表示不能构成线段树。

注意:你可以以任何大小写方式输出答案,例如"Yes""YEs""yEs"都会被认为是输出了"Yes","NO""nO"都会被认为是输出了"No"

如果输出了"Yes",还需要输出第二行包含个整数,表示线段树数组

如果有多种组成方式,你可以输出任何一种。

样例

输入 #1

3 3
1 2 4

输出 #1

Yes
4 2 2

输入 #2

5 7
114 514 1919 810 1

输出 #2

No