// Задача AT6 — ПЪТУВАНЕ ВЪВ ВРЕМЕТО
// Решение с h <= 12 (пълен резултат).
//
// На всяко число от 1 до N (N <= 920) съпоставяме различна 12-битова кодова дума с
// точно шест единици. Такива думи има C(12, 6) = 924 >= 920, колкото ни трябват.
// За двойка (x, y) кодовете са различни, но с еднакъв брой единици, затова съществува
// позиция, на която кодът на x има 1, а кодът на y има 0. Сашка подвиква именно тази
// позиция (число от 1 до 12), а Звезденчо отговаря „да“ точно когато бит h на кода на
// въпроса q е единица — което е вярно и при q = x, и при q = y.



namespace {

const int ALPHABET_BITS = 12;   // дължина на кодовите думи
const int SET_BITS = 6;         // брой единици във всяка кодова дума

int codeword[2000];             // codeword[1..N] -- кодовата дума на всяко число
int codewordCount = 0;

void prepareCodewords() {
    if (codewordCount > 0) {
        return;
    }
    codewordCount = 1;          // индекс 0 не се ползва
    for (int value = 0; value < (1 << ALPHABET_BITS); value++) {
        if (__builtin_popcount(value) == SET_BITS) {
            codeword[codewordCount++] = value;
        }
    }
}

}  // namespace

int encode(int N, int x, int y) {
    prepareCodewords();
    // битове, които са единица в кода на x, но нула в кода на y
    int distinguishing = codeword[x] & ~codeword[y];
    // връщаме позицията (броим от 1) на най-ниския такъв бит
    return __builtin_ctz(distinguishing) + 1;
}

bool answer(int N, int q, int h) {
    prepareCodewords();
    return (codeword[q] >> (h - 1)) & 1;
}
