#include <bits/stdc++.h>
using namespace std;
long long n;
long long mult(long long a, long long b, long long limit) {
  long long x = 0, y = a;
  while (b > 0) {
    if (b % 2 == 1) {
      x = (x + y);
      if (x >= limit) return -1;
    }
    y = (y * 2);
    b /= 2;
    if (y >= limit && b > 0) return -1;
  }
  return x;
}
long long calc(long long teams) {
  long long ret = 0;
  while (teams % 2 == 0) {
    long long hlf = teams / 2;
    ret += hlf;
    teams = hlf;
    if (ret > n) return -1;
  }
  long long prt = mult(teams, teams - 1, 4 * n);
  if (prt == -1) return -1;
  prt /= 2;
  ret += prt;
  if (ret > n) return -1;
  return ret;
}
int main() {
  cin >> n;
  vector<long long> sol;
  for (long long pw2 = 1, cnt = 0; pw2 <= n * 4; pw2 *= 2, cnt++) {
    long long lo = 0, hi = ceil(sqrt(4 * n));
    long long found = -1;
    while (lo <= hi) {
      long long mid = (lo + hi) >> 1;
      long long odd_part = 2 * mid + 1;
      long long tot = mult(odd_part, pw2, 4 * n);
      if (tot == -1) {
        hi = mid - 1;
        continue;
      }
      long long calc_runs = calc(tot);
      if (calc_runs == -1) {
        hi = mid - 1;
        continue;
      } else if (calc_runs == n) {
        found = tot;
        break;
      } else if (calc_runs < n)
        lo = mid + 1;
      else
        hi = mid - 1;
    }
    if (found != -1) sol.push_back(found);
  }
  if (sol.size() == 0) {
    printf("-1\n");
    return 0;
  }
  sort(sol.begin(), sol.end());
  for (int i = 0; i < sol.size(); ++i) cout << sol[i] << endl;
  return 0;
}
