Problem:
Score : 200 points

Problem Statement

There is a kangaroo at coordinate 0 on an infinite number line that runs from left to right, at time 0.
During the period between time i-1 and time i, the kangaroo can either stay at his position, or perform a jump of length exactly i to the left or to the right.
That is, if his coordinate at time i-1 is x, he can be at coordinate x-i, x or x+i at time i.
The kangaroo's nest is at coordinate X, and he wants to travel to coordinate X as fast as possible.
Find the earliest possible time to reach coordinate X.

Constraints

X is an integer.

1≤X≤10^9

Input

The input is given from Standard Input in the following format:

X

Output

Print the earliest possible time for the kangaroo to reach coordinate X.

Sample Input 1

6

Sample Output 1

3

The kangaroo can reach his nest at time 3 by jumping to the right three times, which is the earliest possible time.

Sample Input 2

2

Sample Output 2

2

He can reach his nest at time 2 by staying at his position during the first second, and jumping to the right at the next second.

Sample Input 3

11

Sample Output 3

5

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
#define rep(i,a,b) for (int i = (a) ; i <= (b) ; ++ i)
#define gc() getchar()
#define read(rd) for (rd = gc() ; rd != 'Y' && rd != 'N' ; rd = gc())
using namespace std;
const int N = 4010;
int q[N],tmp[N],a,b,ans[N],q1[N],cnt;
char rd;
void solve(int n,int na,int nb) {
  if (!n) return;
  if (!na) {
    rep (i,0,n-1) ans[q[i]] = 0;
    return;
  } else if (!nb) {
    rep (i,0,n-1) ans[q[i]] = 1;
    return;
  }
  int c0 = 0, c1 = 0, t, nexa = na, nexb = nb;
  cnt = 0;
  rep (i,1,n-1) {
    printf("? %d %d\n",q[i],q[0]);
    fflush(stdout);
    read(rd);
    t = (rd == 'Y');
    tmp[i] = t;
    if (t == 1) c1 ++;
    else c0 ++;
    if (c1 >= na-1) {
      ans[q[0]] = 1;
      rep (j,1,i)
        if (tmp[j] == 0)
          ans[q[j]] = 0;
        else {
          printf("? %d %d\n",q[0],q[j]);
          fflush(stdout);
          read(rd);
          t = (rd == 'Y');
          ans[q[j]] = t;
        }
      rep (j,i+1,n-1) {
        printf("? %d %d\n",q[0],q[j]);
        fflush(stdout);
        read(rd);
        t = (rd == 'Y');
        ans[q[j]] = t;
      }
      return;
    }
    if (c0 >= na) {
      rep (j,1,i)
        if (tmp[j] == 1) ans[q[j]] = 0, nexb--;
        else q1[cnt++] = q[j];
      rep (j,i+1,n-1) q1[cnt++] = q[j];
      rep (j,0,cnt-1) q[j] = q1[j];
      solve(cnt,nexa,nexb);
      return;
    }
  }
}
int main() {
  scanf("%d%d",&a,&b);
  if (a <= b) return 0 * printf("Impossible\n");
  for (int i = 0 ; i < a + b ; ++ i)
    q[i] = i;
  solve(a + b,a,b);
  printf("! ");
  for (int i = 0 ; i < a + b ; ++ i)
    printf("%d",ans[i]);
  puts("");
  return 0;
}