#include<algorithm>#include<bitset>#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<deque>#include<functional>#include<iostream>#include<map>#include<queue>#include<set>#include<stack>#include<string>#include<vector>usingnamespace std;int a[3000010];//2^20大约在1e6左右,所以再开大一点voidadd(int i,int x){//插入函数if(a[i]==-1){//如果这个位置之前没有值,就直接放上去
a[i]= x;return;}if(x > a[i])//如果这个值比根节点大就递归左边(题目要求)add(2* i, x);else//否则递归右边add(2* i +1, x);return;}intmain(int argc,charconst*argv[]){int n;
cin >> n;memset(a,-1,sizeof(a));//初始化for(int i =1; i <= n; i++){//数组模拟建树int x;
cin >> x;add(1, x);}int flag =1;//用于判断是否是第一个输出,从而确定是否要空格int i =1;//遍历int ans =1;//标记是否是完全二叉树int sum =0;//输出元素的个数while(1){while(a[i]==-1) i++;if(flag)printf("%d", a[i]);elseprintf(" %d", a[i]);
flag =0;
i++;
sum++;//输出了一次if(sum == n)break;//全部输出完毕就跳出循环}printf("\n");for(int i =1; i <= n; i++)//检查是否是完全二叉树if(a[i]==-1){
ans =0;break;}if(ans)printf("YES\n");elseprintf("NO\n");return0;}