Informática – Nível Intermediário – Semana 7

por

Número de Fora

Existe uma lista de números $$a_1, a_2, … a_n$$, tal que todos os elementos dessa lista pertencem ao intervalo $$[0, n]$$. Como você pode ver, um dos números desse intervalo está faltando.

Você deve encontrar esse. Para isso, pode-se perguntar o estado do $$b$$-ésimo bit do número $$a_i$$. O número máximo de perguntas é $$2$$ $$\cdotp n + 19$$

Interação:

Esse é um problema interativo. Seu programa irá se comunicar com o juiz, usando o dispositivo padrão de entrada e saída.

Primeiro, seu programa lerá um inteiro $$n$$ – o tamanho da lista

Depois disso, seu programa poderá fazer no máximo $$2$$ $$\cdotp n + 19$$ perguntas. Para fazer uma pergunta, imprima um caractere $$?$$ e então dois inteiros $$i$$ e $$b$$, o índice na lista do número a ser perguntado e o bit a ser perguntado. Note que os bits começam contar a partir de $$0$$

O juiz então imprimira um inteiro $$0$$ ou $$1$$ – o valor do $$b$$-ésimo bit do número $$a_i$$

Quando determinar o número de fora, imprima um caractere ! e o número em si. Termine então o seu programa.

Restrições

  • $$1 \leq n \leq 1000$$
  • $$1 \leq i \leq n$$
  • $$0 \leq b \leq log_2 n$$

Exemplo de interação:

ENTRADA

SAÍDA

3
0
1
0
? 1 1
? 2 0
? 3 1
! 2

Nota:

Cada mensagem que seu programa imprimir deve terminar com uma quebra de linha. Além disso, seu programa deve limpar o buffer, para o juiz ler a informação que foi impressa. Isso pode ser feito ao chamar $$fflush(stdout)$$ ou $$cout.flush()$$ em C++, $$System.out.flush()$$ em Java, $$Console.Out.Flush()$$ em C#, $$flush(output)$$ em pascal, ou $$sys.stdout.flush()$$ em Python.

Para testar sua solução, clique aqui