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
40 #define min(x,y) ((x)<(y)?(x):(y))
43 #define max(x,y) ((x)>(y)?(x):(y))
60 darray *da_dfuds_leaf;
65 int bp_construct(bp *b,int n, pb *B, int opt);
66 void printbp(bp *b, int s, int t);
69 int rank_open(bp *b, int s);
70 int rank_close(bp *b, int s);
71 int select_open(bp *b, int s);
72 int select_close(bp *b, int s);
76 int find_close(bp *b,int s);
77 int find_open(bp *b,int s);
78 int enclose(bp *b,int s);
79 int parent(bp *b,int s);
80 int level_ancestor(bp *b,int s,int d);
81 int depth(bp *b, int s);
82 int preorder_rank(bp *b,int s);
83 int postorder_rank(bp *b,int s);
84 int inspect(bp *b, int s);
85 int isleaf(bp *b, int s);
86 int rmq(bp *b, int s, int t, int opt);
87 int subtree_size(bp *b, int s);
88 int first_child(bp *b, int s);
89 int next_sibling(bp *b, int s);
90 int prev_sibling(bp *b, int s);
91 int deepest_node(bp *b,int s);
92 int subtree_height(bp *b,int s);
93 int is_ancestor(bp *b, int s, int t);
94 int distance(bp *b, int s, int t);
95 int level_lefthmost(bp *b, int d);
96 int level_rigthmost(bp *b, int d);
97 int degree(bp *b,int s);
100 int naive_degree(bp *b, int s);
101 int naive_child(bp *b, int s, int d);
102 int naive_child_rank(bp *b, int t);
103 int naive_rmq(bp *b, int s, int t,int opt);
104 int postorder_select(bp *b,int s);
106 // using preorder select index
107 int preorder_select(bp *b,int s);
110 int leaf_rank(bp *b,int s);
111 int leaf_size(bp *b, int s);
112 int leftmost_leaf(bp *b, int s);
113 int rightmost_leaf(bp *b, int s);
115 // using leaf select index
116 int leaf_select(bp *b,int s);
118 // using inorder index
119 int inorder_rank(bp *b,int s);
121 // using inorder select index
122 int inorder_select(bp *b,int s);
124 // using degree index
125 int fast_degree(bp *b,int s, int t, int ith);
126 int child_rank(bp *b, int t);
127 int child(bp *b, int s, int d);
130 // new functions for persistence purposes, added by Diego Arroyuelo
131 void saveTree(bp *b, FILE *fp);
132 void loadTree(bp *b, FILE *fp);
133 void destroyTree(bp *b);
136 pb getpat_preorder(pb *b);
137 pb getpat_leaf(pb *b);
138 pb getpat_inorder(pb *b);
139 pb getpat_postorder(pb *b);
142 int fwd_excess(bp *b,int s, int rel);
143 int bwd_excess(bp *b,int s, int rel);
145 extern int *matchtbl,*parenttbl;
146 void make_naivetbl(pb *B,int n);
148 extern int popCount[1<<ETW];
149 extern int fwdtbl[(2*ETW+1)*(1<<ETW)];
150 extern int bwdtbl[(2*ETW+1)*(1<<ETW)];
151 extern int mintbl_li[1<<ETW], mintbl_lv[1<<ETW];
152 extern int mintbl_ri[1<<ETW], mintbl_rv[1<<ETW];
153 extern int maxtbl_li[1<<ETW], maxtbl_lv[1<<ETW];
154 extern int maxtbl_ri[1<<ETW], maxtbl_rv[1<<ETW];
156 extern int minmaxtbl_i[4][1<<ETW], minmaxtbl_v[4][1<<ETW];
157 extern int degtbl[1<<ETW];
158 extern int degtbl2[(2*ETW+1)*(1<<ETW)];
159 extern int childtbl[(ETW)*(1<<ETW)];
160 extern int depthtbl[(2*ETW+1)*(1<<ETW)];
161 extern int childtbl2[2*ETW+1][ETW][(1<<ETW)];