#include <bits/stdc++.h>
#pragma comment(linker, "/stack:256000000")
using namespace std;
const int INF = 1000000000;
const long long LINF = 4000000000000000000LL;
const double eps = 1e-9;
void prepare() {}
long long n;
void read() { cin >> n; }
void add(long long &a, long long b) {
  long double x = a;
  long double y = b;
  if (x + y > LINF)
    a = LINF;
  else
    a += b;
}
long long mul(long long a, long long b) {
  long double x = a;
  long double y = b;
  if (x * y > LINF) return LINF;
  return a * b;
}
bool check(long long x, int cnt) {
  long long ret = 0;
  for (int i = (0); i < ((cnt)); i++) {
    x >>= 1;
    add(ret, x);
  }
  add(ret, mul((x & 1) ? x : x / 2, (x & 1) ? (x - 1) / 2 : x - 1));
  return ret >= n;
}
long long get(long long x) {
  long long ret = 0;
  while ((x & 1) == 0) {
    x >>= 1;
    add(ret, x);
  }
  add(ret, mul((x & 1) ? x : x / 2, (x & 1) ? (x - 1) / 2 : x - 1));
  return ret;
}
bool solve() {
  vector<long long> res;
  for (int i = (0); i < ((60)); i++) {
    long long lb = 0, rb = (1LL << 61) >> i;
    while (rb - lb > 1) {
      long long mid = (lb + rb) / 2;
      if (check(mid << i, i))
        rb = mid;
      else
        lb = mid;
    }
    rb <<= i;
    if (get(rb) == n) res.push_back(rb);
  }
  sort((res).begin(), (res).end());
  res.erase(unique((res).begin(), (res).end()), res.end());
  if (res.empty())
    printf("-1\n");
  else {
    for (int i = (0); i < (((int)(res).size())); i++) printf("%I64d\n", res[i]);
  }
  return false;
}
int main() {
  prepare();
  read();
  while (solve())
    ;
  return 0;
}
