#include <stdio.h>
struct tuple{
int x,y,z;
};
int encode(int x,int y,int z){
if (x==0 and y==0 and z==0) return 0;
return (z%2) + 2 * encode(z/2,x,y);
}
tuple decode(int n){
tuple res={};
if (not n) return res;
tuple got=decode(n/2);
res.x+=got.y;
res.y+=got.z;
res.z+=got.x*2+(n%2);
return res;
}
int main(){
tuple t={6,5,4};
int val=encode(t.x,t.y,t.z);
printf("%d %d %d",t.x,t.y,t.z);
printf(" => %d => ",val);
tuple res=decode(val);
printf("%d %d %d\n",res.x,res.y,res.z);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgdHVwbGV7CiAgaW50IHgseSx6Owp9OwoKaW50IGVuY29kZShpbnQgeCxpbnQgeSxpbnQgeil7CiAgaWYgKHg9PTAgYW5kIHk9PTAgYW5kIHo9PTApIHJldHVybiAwOwogIHJldHVybiAoeiUyKSArIDIgKiBlbmNvZGUoei8yLHgseSk7Cn0KCnR1cGxlIGRlY29kZShpbnQgbil7CiAgdHVwbGUgcmVzPXt9OwogIGlmIChub3QgbikgcmV0dXJuIHJlczsKCiAgdHVwbGUgZ290PWRlY29kZShuLzIpOwogIHJlcy54Kz1nb3QueTsKICByZXMueSs9Z290Lno7CiAgcmVzLnorPWdvdC54KjIrKG4lMik7CiAgcmV0dXJuIHJlczsKfQoKaW50IG1haW4oKXsKICB0dXBsZSB0PXs2LDUsNH07CgogIGludCB2YWw9ZW5jb2RlKHQueCx0LnksdC56KTsKICBwcmludGYoIiVkICVkICVkIix0LngsdC55LHQueik7CgogIHByaW50ZigiID0+ICVkID0+ICIsdmFsKTsKICB0dXBsZSByZXM9ZGVjb2RlKHZhbCk7CiAgcHJpbnRmKCIlZCAlZCAlZFxuIixyZXMueCxyZXMueSxyZXMueik7CgogIHJldHVybiAwOwp9