#include <iostream>
#include <random>

#include "rybina.h"

using namespace std;

namespace {

constexpr int kMaxGuesses = 64;

int N;
long long half_size;
long long full_size;
long long password;
int num_guesses = 0;
mt19937 rng;

void fail(string msg) {
    cerr << msg << endl;
    exit(0);
}

} // namespace

GuessResult guess(long long X) {
    num_guesses++;
    if (num_guesses > kMaxGuesses) {
        fail("Too many guesses.");
    }
    if (X < 0 || X >= full_size) {
        fail("Invalid guess.");
    }
    if (X == password) {
        cerr << "OK " << num_guesses << " guesses." << endl;
        exit(0);
    }

    int comparison = (X < password) ? 1 : -1;
    bool swapped = rng() & 1;
    if (swapped) {
        long long A = password / half_size, B = password % half_size;
        password = B * half_size + A;
    }
    return {comparison, swapped};
}

int main() {
    long long seed, target;
    cin >> N >> seed >> target;

    half_size = 1;
    for (int i = 0; i < N; ++i)
        half_size *= 10;
    full_size = half_size * half_size;

    password = target;
    rng.seed(seed);

    rybina_search(N);

    fail("No guess was correct.");
}
