#include <stdint.h>
#define N 1<<27

#define min(x, y) (x<y?x:y)
#define max(x, y) (x<y?y:x)
#define SWAP(x,y) { const uint64_t a = min(temp[x], temp[y]); const uint64_t b = max(temp[x], temp[y]); temp[x] = a; temp[y] = b;}

uint64_t s[2] = {0xb78895b278bfd25bULL, 0x5b1384c2629587a9ULL};

inline uint64_t xrand(void) {
        uint64_t s1 = s[0];
        const uint64_t s0 = s[1];
        s[0] = s0;
        s1 ^= s1 << 23;
        return (s[1] = (s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26))) + s0;
}

int main(void){
        uint32_t i;
        uint64_t temp[9] = {0}, t, r;

        for(i = 0; i < N; i ++){
                temp[0] = xrand();
                temp[1] = xrand();
                temp[2] = xrand();
                temp[3] = xrand();
                temp[4] = xrand();
                temp[5] = xrand();
                temp[6] = xrand();
                temp[7] = xrand();
                temp[8] = xrand();

                SWAP(0, 1);
                SWAP(3, 4);
                SWAP(6, 7);
                SWAP(1, 2);
                SWAP(4, 5);
                SWAP(7, 8);
                SWAP(0, 1);
                SWAP(3, 4);
                SWAP(6, 7);
                SWAP(0, 3);
                SWAP(3, 6);
                SWAP(0, 3);
                SWAP(1, 4);
                SWAP(4, 7);
                SWAP(1, 4);
                SWAP(2, 5);
                SWAP(5, 8);
                SWAP(2, 5);
                SWAP(1, 3);
                SWAP(5, 7);
                SWAP(2, 6);
                SWAP(4, 6);
                SWAP(2, 4);
                SWAP(2, 3);
                SWAP(5, 6);

                r ^= temp[6];
        }

        return r;
}
