CF1840G2.In Search of Truth (Hard Version)

普及/提高-

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

The only difference between easy and hard versions is the maximum number of queries. In this version, you are allowed to ask at most 10001000 queries.

This is an interactive problem.

You are playing a game. The circle is divided into nn sectors, sectors are numbered from 11 to nn in some order. You are in the adjacent room and do not know either the number of sectors or their numbers. There is also an arrow that initially points to some sector. Initially, the host tells you the number of the sector to which the arrow points. After that, you can ask the host to move the arrow kk sectors counterclockwise or clockwise at most 10001000 times. And each time you are told the number of the sector to which the arrow points.

Your task is to determine the integer nn — the number of sectors in at most 10001000 queries.

It is guaranteed that 1n1061 \le n \le 10^6 .

输入格式

The input consists of a single integer xx ( 1xn1 \le x \le n ) — the number of the initial sector.

输出格式

After you determine the integer nn — the number of sectors, you should output "! n" ( 1n1061 \le n \le 10^6 ). After that the program should immediately terminate.

Note that, printing the answer does not count as a query.

It is guaranteed that the integer nn and the numbers of the sectors are fixed initially and will not be changed by the jury program depending on the queries.

Interaction

After reading the description of the input, you may ask queries. Queries can be of two types:

  1. "+ k" ( 0k1090 \le k \le 10^9 ) — ask to move the arrow kk sectors clockwise.
  2. "- k" ( 0k1090 \le k \le 10^9 ) — ask to move the arrow kk sectors counterclockwise.

After each query, you should read an integer xx ( 1xn1 \le x \le n ) — the number of the current sector to which the arrow points.

You are allowed to make at most 10001000 queries in total.

If you make too many queries, you will get Wrong answer.

After printing a query or the answer, do not forget to output a the end of line and flush the output. Otherwise, you will get Idleness limit exceeded. To do this, use:

  • fflush(stdout) or cout.flush() in C++;
  • System.out.flush() in Java;
  • flush(output) in Pascal;
  • stdout.flush() in Python;
  • see the documentation for other languages.

输入输出样例

  • 输入#1

    1
    
    5
    
    6
    
    7
    
    2
    
    10
    
    9
    
    8
    
    4
    
    3
    
    1

    输出#1

    + 1
    
    + 1
    
    + 1
    
    + 1
    
    + 1
    
    + 1
    
    + 1
    
    + 1
    
    + 1
    
    + 1
    
    ! 10

说明/提示

Hacks

To hack, use the following test format.

In the first line, output a single integer nn ( 1n1061 \le n \le 10^6 ) — the number of sectors.

In the second line, output nn different integers 1a1,a2,,ann1 \le a_1, a_2, \dots, a_n \le n — the numbers of the sectors in clockwise order, the arrow initially points to the sector with the number a1a_1 .

首页