完全二叉树有很多性质
每层树枝都有左右子树
直接用规律
除了最后一层外,其他层最后一个数都是2的k次幂 - 1,而起始都是2的k - 1次幂,所以只要最后一层取min(n, 1 << k - 1);
当2的k - 1次幂 > n 时就说明没这层,empty
#include<iostream>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
int qread(){
int w=1,c,ret;
while((c = getchar()) > '9' || c < '0') w = (c == '-' ? -1 : 1); ret = c - '0';
while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';
return ret * w;
}
const int N = 1e3 + 10;
int n;
int q[N];
int k;
int main(){
n = qread();
up(0 ,n - 1,i) q[i] = qread();
k = qread();
int st = (1 << k - 1) - 1 , ed = min((1 << k ) - 1,n);
if(st>=n) {
puts("EMPTY");
return 0;
};
up(st,ed - 1,i) cout<<q[i]<<" ";
}