Problem:
Score : 300 points

Problem Statement

The problem set at CODE FESTIVAL 20XX Finals consists of N problems.

The score allocated to the i-th (1≦i≦N) problem is i points.

Takahashi, a contestant, is trying to score exactly N points. For that, he is deciding which problems to solve.

As problems with higher scores are harder, he wants to minimize the highest score of a problem among the ones solved by him.

Determine the set of problems that should be solved.

Constraints

1≦N≦10^7

Partial Score

200 points will be awarded for passing the test set satisfying 1≦N≦1000.

Additional 100 points will be awarded for passing the test set without additional constraints.

Input

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

N

Output

Among the sets of problems with the total score of N, find a set in which the highest score of a problem is minimum, then print the indices of the problems in the set in any order, one per line.

If there exists more than one such set, any of them will be accepted.

Sample Input 1

4

Sample Output 1

1
3

Solving only the 4-th problem will also result in the total score of 4 points, but solving the 1-st and 3-rd problems will lower the highest score of a solved problem.

Sample Input 2

7

Sample Output 2

1
2
4

The set \{3,4\} will also be accepted.

Sample Input 3

1

Sample Output 3

1

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#pragma region template
#pragma GCC diagnostic ignored "-Wunused-result"
// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>

#define all(a) (a).begin(),(a).end()
#define sz(a) (int)(a).size()
#define last(a) (a).at((int)(a).size()-1)
#define rep(i,n) for(int i=0,i##_len=(n);i<i##_len;i++)
#define brep(i,a,b) for(int i=(a),i##_len=(b);i<=i##_len;i++)
#define rrep(i,n) int i=(n);int now=-1;while(i--&&(now++||1))
#define xrep(i,n) for(int i=1,i##_len=(n);i<=i##_len;i++)
#define Yes(n) cout<<((n)?YES:NO)<<'\n'
#define co(n) cout<<(n)<<'\n'
#define fo(n) printf("%.15lf\n",(n))
#define fout cout<<fixed<<setprecision(15)
#define Sort(v) sort(all(v))
#define rSort(v) sort(all(v),greater<typeof(v[0])>())
#define Rev(v) reverse(all(v))
#define Unique(v) (v).erase(unique(all(v)),(v).end())
#define eb emplace_back
#define fi first
#define se second

#ifdef ONLINE_JUDGE
#define here()
#define cprint(vec)
#define comment(msg)
#define observe(...)
#define local(x)
#define alter(x,y) y
#else
#define here() cerr<<__func__<<'/'<<__LINE__<<": passed\n"
#define cprint(vec) print_e(vec)
#define comment(msg) cerr<<"{ "<<msg<< " }\n"
#define observe(...) __f(#__VA_ARGS__, __VA_ARGS__)
#define local(x) x
#define alter(x,y) x
#endif

using namespace std;
using ll    = long long;
using ld    = long double;
using ull   = unsigned long long;
using vbl   = vector<bool>;
using dqbl  = deque<bool>;
using vint  = vector<int>;
using vll   = vector<long long>;
using vdbl  = vector<double>;
using vstr  = vector<string>;
using vvbl  = vector<vector<bool>>;
using vdqbl = vector<deque<bool>>;
using vvint = vector<vector<int>>;
using vvll  = vector<vector<long long>>;

template<class T>
  using uset = unordered_set<T>;
template<class T>
  using pq = priority_queue<T>;
template<class S, class T>
  using umap = unordered_map<S, T>;

constexpr int         INF   = 1e9;
constexpr long long   LINF  = 1e18;
constexpr double      EPS   = 1e-9;
constexpr long double LEPS  = 1e-18;

// --- functions which take 1 argument --- //
template<class T> inline int sgn(const T &x){return (x>0)-(x<0);}
template<class T> inline int digit(T x){int r=1;while((x/=10)>=1)r++;return r;}
template<class T> inline double deg_to_rad(const T &a){return a/180.0*M_PI;}
template<class T> inline double rad_to_deg(const T &a){return a/M_PI*180.0;}
template<class T> inline ll factorial(const T &n){if(n==0)return 1;ll r=1;brep(i,2,n)r*=i;return r;}
template<class T> inline map<T,T> factorize(T n){map<T,T>r;for(T i=2;i*i<=n;i++){while(n%i==0){r[i]++;n/=i;}}if(n!=1)r[n]=1;return r;}
template<class T> inline vector<T> divisor(const T &n){vector<T>r;for(T i=1;i*i<=n;i++){if(!(n%i)){r.eb(i);if(i*i!=n)r.eb(n/i);}}Sort(r);return r;}

// --- functions which take 2 arguments --- //
template<class T> inline bool chmax(T &a,const T &b){if(a<b){a=b;return 1;}return 0;}
template<class T> inline bool chmin(T &a,const T &b){if(a>b){a=b;return 1;}return 0;}
template<class T> inline T nPr(const T &n,const T &k){if(n<k||n<0||k<0)return 0;T r=1;brep(i,n-k+1,n)r*=i;return r;}
template<class T> inline T nCr(const T &n,const T &k){if(n<k||n<0||k<0)return 0;T r=1;k=min(k,n-k);brep(i,n-k+1,n)r*=i;return r/factorial(k);}

// --- functions which take vector/deque as argument --- //
template<class T> inline void print(const vector<T> &v){cout<<"[ ";for(auto &x:v)cout<<x<<' ';cout<<"]\n";}
template<class T> inline void print(const deque<T> &v){cout<<"[ ";for(auto &x:v)cout<<x<<' ';cout<<"]\n";}
template<class T> inline void print(const vector<vector<T>> &v){for(auto &x:v)print<T>(x);}
template<class T> inline void print(const vector<deque<T>> &v){for(auto &x:v)print<T>(x);}
template<class T> inline void print_d(const vector<T> &v,string d){rep(i,sz(v)-1)cout<<v[i]<<d;cout<<last(v)<<'\n';}
template<class T> inline void print_d(const vector<vector<T>> &v,string d){for(auto &x:v)print_d(x,d);}
template<class T> inline bool in(const T &k,const vector<T> &v){return find(all(v),k)!=v.end();}
                  inline bool in(const int &k,const vector<ll> &v){return find(all(v),k)!=v.end();}
                  inline bool in(const ll &k,const vector<int> &v){return find(all(v),k)!=v.end();}
                  inline bool in(const char &k,const string& v){return find(all(v),k)!=v.end();}
                  inline bool in(const char* &k,const vector<string> &v){return find(all(v),k)!=v.end();}
template<class T> inline T min(const vector<T> &v){return *min_element(all(v));}
template<class T> inline T max(const vector<T> &v){return *max_element(all(v));}
template<class T> inline T sum(const vector<T> &v){return reduce(all(v),(T)0);}
template<class T> inline T gcd(const vector<T> &v){T r=v[0];brep(i,1,sz(v)-1)r=gcd(r,v[i]);return r;}
template<class T> inline T lcm(const vector<T> &v){T r=v[0];brep(i,1,sz(v)-1)r=lcm(r,v[i]);return r;}
template<class T> inline double abs(const vector<T> &v){return sqrt(reduce(all(v),0.0,[](T s,T v){return s+=v*v;}));}
template<class T> inline T vector_add(const T &u,const T &v){T r(u.size());rep(i,u.size())r[i]=u[i]+v[i];return r;}
template<class T> inline T vector_subtract(const T &u,const T &v){T r(u.size());rep(i,u.size())r[i]=u[i]-v[i];return r;}
template<class T> inline T vector_multiply(const T &u,const T &v){T r(u.size());rep(i,u.size())r[i]=u[i]*v[i];return r;}
template<class S, class T> inline common_type<S,T> dot_product(const vector<S> &u,const vector<T> &v){T r=0;rep(i,u.size())r+=u[i]*v[i];return r;}
template<class S, class T> inline void sort_by_second(vector<pair<S,T>> &v){sort(all(v),[](auto &L,auto &R){return L.second<R.second;});}

// --- functions which take set/map as argument --- //
template<class T> inline bool in(const T &k,const set<T> &v){return find(all(v),k)!=v.end();}
template<class T> inline bool in(const T &k,const unordered_set<T> &v){return find(all(v),k)!=v.end();}
template<class T> inline T min(const set<T> &v){return *min_element(all(v));}
template<class T> inline T min(const unordered_set<T> &v){return *min_element(all(v));}
template<class T> inline T max(const set<T> &v){return *max_element(all(v));}
template<class T> inline T max(const unordered_set<T> &v){return *max_element(all(v));}
template<class T> inline T sum(const set<T> &v){return reduce(all(v),(T)0);}
template<class T> inline T sum(const unordered_set<T> &v){return reduce(all(v),(T)0);}
template<class T> inline T gcd(const set<T> &v){T r=0;for(T x:v)r=(r==0)?x:gcd(r,x);return r;}
template<class T> inline T gcd(const unordered_set<T> &v){T r=0;for(T x:v)r=(r==0)?x:gcd(r,x);return r;}
template<class T> inline T lcm(const set<T> &v){T r=0;for(T x:v)r=(r==0)?x:lcm(r,x);return r;}
template<class T> inline T lcm(const unordered_set<T> &v){T r=0;for(T x:v)r=(r==0)?x:lcm(r,x);return r;}
template<class T>          inline void print(const set<T> &v){cout<<"[ ";for(T &x:v)cout<<x<<' ';cout<<"]\n";}
template<class T>          inline void print(const unordered_set<T> &v){cout<<"[ ";for(T& x:v)cout<<x<<' ';cout<<"]\n";}
template<class S, class T> inline void print(const map<S,T> &m){cout<<"[ ";for(auto &x:m)cout<<"{ "<<x.fi<<", "<<x.se<<" } ";cout<<"]\n";}
template<class S, class T> inline void print(const unordered_map<S,T> &m){cout<<"[ ";for(auto &x:m)cout<<"{ "<<x.fi<<", "<<x.se<<" } ";cout<<"]\n";}

// --- functions for debugging --- //
template<class T> void __f(const char* n,T&& v){cerr<<n<<": "<<v<<'\n';}
template<class S, class... T> void __f(const char* n,S&& v,T&&... w){const char* c=strchr(n+1,',');cerr.write(n,c-n)<< ": "<<v<<" |";__f(c+1,w...);}
template<class T> inline void print_e(const vector<T> &v){cerr<<"[ ";for(auto &x:v)cerr<<x<<' ';cerr<<"]\n";}
template<class T> inline void print_e(const vector<vector<T>> &v){for(auto &x:v)print_e<T>(x);}
#pragma endregion template

inline ll __s(const ll &n) {
  ll ans = 0;
  while (++ans) {
    if (ans * ans > n) break;
  }
  return ans - 1;
}

void solve(long long N) {
  ll num_of_problems_to_solve = (__s(1 + 8*N) - 1)/2;
  ll points_remaining = N - (num_of_problems_to_solve + 1) * num_of_problems_to_solve / 2;
  
  for (int i = 1; i <= num_of_problems_to_solve; i++) {
    if (num_of_problems_to_solve - points_remaining >= i) printf("%d\n", i);
    else printf("%d\n", i+1);
  }
}

int main() {
  long long N;
  scanf("%lld",&N);
  solve(N);
  return 0;
}