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 FOR(i, begin, end) for(int i=(begin);i<(end);i++)
#define REP(i, n) FOR(i,0,n)
#define IFOR(i, begin, end) for(int i=(end)-1;i>=(begin);i--)
#define IREP(i, n) IFOR(i,0,n)
#define SORT(a) sort(a.begin(), a.end())
#define REVERSE(a) reverse(a.begin(), a.end())
#define int long long
#define INF 1000000000000000
using namespace std;

typedef vector<int> vec;
typedef vector<vec> mat;
typedef pair<int, int> Pii;

template<typename T>
void readvec(vector<T> &a);
void readindex(vector<int> &a);



signed main(){

    int N, K; cin >> N >> K;
    vec a(N); readvec(a);

    int U = 70;
    int Nu = N / U + min(1LL, N % U);

    mat a0(Nu, vec(0));

    int sumv = 0;


    REP(i, Nu){
        REP(j, U){
            if(i * U + j < N) a0[i].push_back(a[i * U + j]);
        }
    }

    vector<vector<bool>> dp(Nu, vector<bool>(K, false));
    REP(i, Nu) dp[i][0] = true;
    REP(i, Nu){
        REP(i2, Nu){
            if(i2 == i) continue;
            REP(j, a0[i2].size()){
                vector<bool> dptmp = dp[i];
                REP(k, K - a0[i2][j]){
                    if(dp[i][k]) dptmp[k + a0[i2][j]] = true;
                }
                dp[i] = dptmp;
            }
        }
    }

    int ans = 0;
    REP(i, Nu){
        REP(j, a0[i].size()){
            if(a0[i][j] >= K) continue;
            vector<bool> dptmp = dp[i];
            REP(j2, a0[i].size()){
                if(j2 == j) continue;
                vector<bool> dptmp2 = dptmp;
                REP(k, K - a0[i][j2]){
                    if(dptmp[k]) dptmp2[k + a0[i][j2]] = true;
                }
                dptmp = dptmp2;
            }
            bool noneed = true;
            FOR(k, K - a0[i][j], K){
                if(dptmp[k]){
                    noneed = false;
                    break;
                }
            }
            if(noneed) ans++;
        }
    }

    cout << ans;
    
    return 0;
}


template<typename T>
void readvec(vector<T> &a){
    REP(i, a.size()){
        cin >> a[i];
    }
}
void readindex(vector<int> &a){
    REP(i, a.size()){
        cin >> a[i];
        a[i]--;
    }
}