\r
R.n = 2*n-1;\r
R.lgn = lg(n);\r
- fprintf(stderr,"Size of the result set : %i elements, %li kB\n", n,\r
- (((R.n+W-1)/W)*sizeof(int)/1024));\r
+ //fprintf(stderr,"Size of the result set : %i elements, %li kB\n", n,\r
+ //(((R.n+W-1)/W)*sizeof(int)/1024));\r
R.tree = (int*) malloc (((R.n+W-1)/W)*sizeof(int));\r
clearBit(R.tree,0); // clear all\r
return R;\r
static int conv (int p, int n, int lgn)\r
\r
{ int t = n+1-(1<<lgn);\r
- if (p < t) return p;\r
- return (p<<1)-t;\r
+ return (p < t) ? p : (p<<1)-t;\r
}\r
\r
static int unconv (int p, int n, int lgn)\r
\r
{ int t = n+1-(1<<lgn);\r
- if (p < t) return p;\r
- return (p+t)>>1;\r
+ return (p < t) ? p : (p+t)>>1;\r
}\r
\r
int readResult (results R, int p) // returns 0 or 1\r
\r
{ int answ;\r
if (!getBit(tree,pos)) return -1; // no answer\r
- pot--;\r
pos = (pos<<1)+1;\r
if (pos >= n) return 0; // when n is not a power of 2, missing leaves\r
+ pot--;\r
if ((p>>pot) == 0) // p goes left\r
{ answ = nextLarger(tree,n,p&~(1<<pot),pos,pot);\r
if (answ != -1) return answ;\r
{ int answ;\r
if (((p+1)<<1) > R.n) return -1; // next(last), p+1 out of bounds\r
answ = nextLarger(R.tree,R.n,conv(p+1,R.n,R.lgn),0,R.lgn);\r
- if (answ == -1) return -1;\r
- return unconv(answ,R.n,R.lgn);\r
+ return (answ == -1) ? -1 : unconv(answ,R.n,R.lgn);\r
}\r
\r
// Naively implemented by kim\r