21 #define OPT_LEAF (1<<0)
22 #define OPT_INORDER (1<<1)
23 #define OPT_DEGREE (1<<2)
24 #define OPT_FAST_PREORDER_SELECT (1<<3)
25 #define OPT_FAST_LEAF_SELECT (1<<4)
26 #define OPT_FAST_INORDER_SELECT (1<<5)
27 #define OPT_FAST_POSTORDER_SELECT (1<<6)
28 #define OPT_DFUDS_LEAF (1<<7)
29 #define OPT_FAST_DFUDS_LEAF_SELECT (1<<8)
41 #define ETW 8 // width of excess lookup table
42 #define W1 2 // branching factor
59 darray *da_dfuds_leaf;
64 int bp_construct(bp *b,int n, pb *B, int opt);
65 void printbp(bp *b, int s, int t);
68 int rank_open(bp *b, int s);
69 int rank_close(bp *b, int s);
70 int select_open(bp *b, int s);
71 int select_close(bp *b, int s);
75 int find_close(bp *b,int s);
76 int find_open(bp *b,int s);
77 int enclose(bp *b,int s);
78 int parent(bp *b,int s);
79 int level_ancestor(bp *b,int s,int d);
80 int depth(bp *b, int s);
81 int preorder_rank(bp *b,int s);
82 int postorder_rank(bp *b,int s);
83 int inspect(bp *b, int s);
84 int isleaf(bp *b, int s);
85 int rmq(bp *b, int s, int t, int opt);
86 int subtree_size(bp *b, int s);
87 int first_child(bp *b, int s);
88 int next_sibling(bp *b, int s);
89 int prev_sibling(bp *b, int s);
90 int deepest_node(bp *b,int s);
91 int subtree_height(bp *b,int s);
92 int is_ancestor(bp *b, int s, int t);
93 int distance(bp *b, int s, int t);
94 int level_lefthmost(bp *b, int d);
95 int level_rigthmost(bp *b, int d);
96 int degree(bp *b,int s);
99 int naive_degree(bp *b, int s);
100 int naive_child(bp *b, int s, int d);
101 int naive_child_rank(bp *b, int t);
102 int naive_rmq(bp *b, int s, int t,int opt);
103 int postorder_select(bp *b,int s);
105 // using preorder select index
106 int preorder_select(bp *b,int s);
109 int leaf_rank(bp *b,int s);
110 int leaf_size(bp *b, int s);
111 int leftmost_leaf(bp *b, int s);
112 int rightmost_leaf(bp *b, int s);
114 // using leaf select index
115 int leaf_select(bp *b,int s);
117 // using inorder index
118 int inorder_rank(bp *b,int s);
120 // using inorder select index
121 int inorder_select(bp *b,int s);
123 // using degree index
124 int fast_degree(bp *b,int s, int t, int ith);
125 int child_rank(bp *b, int t);
126 int child(bp *b, int s, int d);
129 // new functions for persistence purposes, added by Diego Arroyuelo
130 void saveTree(bp *b, FILE *fp);
131 void loadTree(bp *b, FILE *fp);
132 void destroyTree(bp *b);
135 inline int blog(int x)
146 pb getpat_preorder(pb *b);
147 pb getpat_leaf(pb *b);
148 pb getpat_inorder(pb *b);
149 pb getpat_postorder(pb *b);
152 int fwd_excess(bp *b,int s, int rel);
153 int bwd_excess(bp *b,int s, int rel);
155 extern int *matchtbl,*parenttbl;
156 void make_naivetbl(pb *B,int n);
158 extern int popCount[1<<ETW];
159 extern int fwdtbl[(2*ETW+1)*(1<<ETW)];
160 extern int bwdtbl[(2*ETW+1)*(1<<ETW)];
161 extern int mintbl_li[1<<ETW], mintbl_lv[1<<ETW];
162 extern int mintbl_ri[1<<ETW], mintbl_rv[1<<ETW];
163 extern int maxtbl_li[1<<ETW], maxtbl_lv[1<<ETW];
164 extern int maxtbl_ri[1<<ETW], maxtbl_rv[1<<ETW];
166 extern int minmaxtbl_i[4][1<<ETW], minmaxtbl_v[4][1<<ETW];
167 extern int degtbl[1<<ETW];
168 extern int degtbl2[(2*ETW+1)*(1<<ETW)];
169 extern int childtbl[(ETW)*(1<<ETW)];
170 extern int depthtbl[(2*ETW+1)*(1<<ETW)];
171 extern int childtbl2[2*ETW+1][ETW][(1<<ETW)];