#include <stdio.h>
typedef int value_t;
void SWAP(value_t* a, value_t* b) {
value_t t = *a;
*a = *b; *b = t;
}
int next_index(int n)
{
while (n & 1) { n = n >> 1; }
return n >> 1;
}
void interleave(value_t A[], int n)
{
int i, j, k;
int m = n/2;
value_t* L = A;
value_t* R = A+m;
// Place 1st half
for (i=0; i < m; i++) {
j = next_index(i);
SWAP( L+i, R+j);
}
//unscramble step
for (j=0;j < m/2 -1; j++) {
k = next_index(m/2 + j);
while (k < j) {
k = next_index(m/2 + k);
}
SWAP( R+j, R+k);
}
if (n-m > 1) {
int b = (m&1) ? 1 : 0;
interleave(R+b, n-m-b);
}
}
value_t A[100];
int main(void) {
int i;
int count = 20;
for (i=0;i<count; i++) {
A[i]=i;
}
interleave(A, count);
for (i=0;i<count; i++) {
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIGludCB2YWx1ZV90OwoKdm9pZCBTV0FQKHZhbHVlX3QqIGEsIHZhbHVlX3QqIGIpIHsKICB2YWx1ZV90IHQgPSAqYTsKICAqYSA9ICpiOyAqYiA9IHQ7Cn0KCmludCBuZXh0X2luZGV4KGludCBuKQp7CiAgd2hpbGUgKG4gJiAxKSB7IG4gPSBuID4+IDE7IH0KICByZXR1cm4gbiA+PiAxOwp9CiAgCnZvaWQgaW50ZXJsZWF2ZSh2YWx1ZV90IEFbXSwgaW50IG4pCnsKICBpbnQgaSwgaiwgazsKICBpbnQgbSA9IG4vMjsKICB2YWx1ZV90KiBMID0gQTsKICB2YWx1ZV90KiBSID0gQSttOwoKICAvLyBQbGFjZSAxc3QgaGFsZgogIGZvciAoaT0wOyBpIDwgbTsgaSsrKSB7CiAgICBqID0gbmV4dF9pbmRleChpKTsKICAgIFNXQVAoIEwraSwgUitqKTsKICB9CgogIC8vdW5zY3JhbWJsZSBzdGVwCiAgZm9yIChqPTA7aiA8IG0vMiAtMTsgaisrKSB7CiAgICBrID0gbmV4dF9pbmRleChtLzIgKyBqKTsKICAgIHdoaWxlIChrIDwgaikgewogICAgICBrID0gbmV4dF9pbmRleChtLzIgKyBrKTsKICAgIH0KICAgIFNXQVAoIFIraiwgUitrKTsKICB9CiAgaWYgKG4tbSA+IDEpIHsKICAgIGludCBiID0gKG0mMSkgPyAxIDogMDsKICAgIGludGVybGVhdmUoUitiLCBuLW0tYik7CiAgfQp9Cgp2YWx1ZV90IEFbMTAwXTsgCmludCBtYWluKHZvaWQpIHsKCWludCBpOwoJaW50IGNvdW50ID0gMjA7Cglmb3IgKGk9MDtpPGNvdW50OyBpKyspIHsKCQlBW2ldPWk7Cgl9CglpbnRlcmxlYXZlKEEsIGNvdW50KTsKCWZvciAoaT0wO2k8Y291bnQ7IGkrKykgewoJCXByaW50ZigiJSAyZCIsQVtpXSk7Cgl9CiAgICBwcmludGYoIlxuIik7Cn0=