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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
            // 入力
            int iX = int.Parse(Console.ReadLine().Trim());

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            // 解析
            int iOut = 0;
            int iSq1 = (int)Math.Sqrt(iX * 2) - 1;          // 直近の数列のN番目の候補1
            int iSq2 = iSq1 + 1;                            // 直近の数列のN番目の候補2
            int iSqr = iSq1;                                // 直近の数列のN番目
            int iPr1 = (iSq1 * (iSq1 + 1)) / 2;             // 直近の数列のN番目の候補1の値
            int iPr2 = (iSq2 * (iSq2 + 1)) / 2;             // 直近の数列のN番目の候補2の値
            int iPro = iPr1;                                // 直近の数列のN番目       の値
            if (iX >= iPr2) { iSqr = iSq2; iPro = iPr2; }   // 候補の中から近い方
            int iDif = iX - iPro;                           // 直近の数列のN番目       の値からの差
            iOut = iSqr - 1 + iDif + 1;                     // 直近の数列のN番目の一つ前からの時間 iDif=0の差で+1秒で 直近の数列のN番目の値

            //出力
            Console.WriteLine("{0}", iOut.ToString().Trim());

            sw.Stop();
#if DEBUG
            Console.WriteLine();
            Console.WriteLine("{0}", sw.Elapsed.ToString());
            Console.WriteLine("続行するには何かキーを押してください．．．");
            Console.ReadKey();
#endif
    }
}