16 #define OPT_LEAF (1<<0)
17 #define OPT_INORDER (1<<1)
18 #define OPT_DEGREE (1<<2)
19 #define OPT_FAST_PREORDER_SELECT (1<<3)
20 #define OPT_FAST_LEAF_SELECT (1<<4)
21 #define OPT_FAST_INORDER_SELECT (1<<5)
22 #define OPT_FAST_POSTORDER_SELECT (1<<6)
23 #define OPT_DFUDS_LEAF (1<<7)
24 #define OPT_FAST_DFUDS_LEAF_SELECT (1<<8)
36 #define ETW 8 // width of excess lookup table
37 #define W1 2 // branching factor
54 darray *da_dfuds_leaf;
59 int bp_construct(bp *b,int n, pb *B, int opt);
60 void printbp(bp *b, int s, int t);
63 int rank_open(bp *b, int s);
64 int rank_close(bp *b, int s);
65 int select_open(bp *b, int s);
66 int select_close(bp *b, int s);
70 int find_close(bp *b,int s);
71 int find_open(bp *b,int s);
72 int enclose(bp *b,int s);
73 int parent(bp *b,int s);
74 int level_ancestor(bp *b,int s,int d);
75 int depth(bp *b, int s);
76 int preorder_rank(bp *b,int s);
77 int postorder_rank(bp *b,int s);
78 int inspect(bp *b, int s);
79 int isleaf(bp *b, int s);
80 int rmq(bp *b, int s, int t, int opt);
81 int subtree_size(bp *b, int s);
82 int first_child(bp *b, int s);
83 int next_sibling(bp *b, int s);
84 int prev_sibling(bp *b, int s);
85 int deepest_node(bp *b,int s);
86 int subtree_height(bp *b,int s);
87 int is_ancestor(bp *b, int s, int t);
88 int distance(bp *b, int s, int t);
89 int level_lefthmost(bp *b, int d);
90 int level_rigthmost(bp *b, int d);
91 int degree(bp *b,int s);
94 int naive_degree(bp *b, int s);
95 int naive_child(bp *b, int s, int d);
96 int naive_child_rank(bp *b, int t);
97 int naive_rmq(bp *b, int s, int t,int opt);
98 int postorder_select(bp *b,int s);
100 // using preorder select index
101 int preorder_select(bp *b,int s);
104 int leaf_rank(bp *b,int s);
105 int leaf_size(bp *b, int s);
106 int leftmost_leaf(bp *b, int s);
107 int rightmost_leaf(bp *b, int s);
109 // using leaf select index
110 int leaf_select(bp *b,int s);
112 // using inorder index
113 int inorder_rank(bp *b,int s);
115 // using inorder select index
116 int inorder_select(bp *b,int s);
118 // using degree index
119 int fast_degree(bp *b,int s, int t, int ith);
120 int child_rank(bp *b, int t);
121 int child(bp *b, int s, int d);
124 // new functions for persistence purposes, added by Diego Arroyuelo
125 void saveTree(bp *b, FILE *fp);
126 void loadTree(bp *b, FILE *fp);
127 void destroyTree(bp *b);
130 inline int blog(int x)
141 pb getpat_preorder(pb *b);
142 pb getpat_leaf(pb *b);
143 pb getpat_inorder(pb *b);
144 pb getpat_postorder(pb *b);
147 int fwd_excess(bp *b,int s, int rel);
148 int bwd_excess(bp *b,int s, int rel);
150 extern int *matchtbl,*parenttbl;
151 void make_naivetbl(pb *B,int n);
153 extern int popCount[1<<ETW];
154 extern int fwdtbl[(2*ETW+1)*(1<<ETW)];
155 extern int bwdtbl[(2*ETW+1)*(1<<ETW)];
156 extern int mintbl_li[1<<ETW], mintbl_lv[1<<ETW];
157 extern int mintbl_ri[1<<ETW], mintbl_rv[1<<ETW];
158 extern int maxtbl_li[1<<ETW], maxtbl_lv[1<<ETW];
159 extern int maxtbl_ri[1<<ETW], maxtbl_rv[1<<ETW];
161 extern int minmaxtbl_i[4][1<<ETW], minmaxtbl_v[4][1<<ETW];
162 extern int degtbl[1<<ETW];
163 extern int degtbl2[(2*ETW+1)*(1<<ETW)];
164 extern int childtbl[(ETW)*(1<<ETW)];
165 extern int depthtbl[(2*ETW+1)*(1<<ETW)];
166 extern int childtbl2[2*ETW+1][ETW][(1<<ETW)];