#include <bits/stdc++.h>
using namespace std;
long long factor[100], fac_top, orn;
long long gcd(long long a, long long b) {
  if (a == 0) return b;
  long long c;
  while (b != 0) {
    c = b;
    b = a % b;
    a = c;
  }
  return a;
}
long long muti_mod(long long a, long long b, long long n) {
  long long exp = a % n, res = 0;
  while (b) {
    if (b & 1) {
      res += exp;
      if (res > n) res -= n;
    }
    exp <<= 1;
    if (exp > n) exp -= n;
    b >>= 1;
  }
  return res;
}
long long mod_exp(long long a, long long p, long long m) {
  long long exp = a % m, res = 1;
  while (p > 1) {
    if (p & 1) res = muti_mod(res, exp, m);
    exp = muti_mod(exp, exp, m);
    p >>= 1;
  }
  return muti_mod(res, exp, m);
}
bool miller_rabin(long long n, long long times) {
  if (n == 2) return 1;
  if (n < 2 || !(n & 1)) return 0;
  long long a, u = n - 1, x, y;
  int t = 0;
  while (u % 2 == 0) {
    t++;
    u /= 2;
  }
  for (int i = 0; i < times; i++) {
    a = rand() % (n - 1) + 1;
    x = mod_exp(a, u, n);
    for (int j = 0; j < t; j++) {
      y = muti_mod(x, x, n);
      if (y == 1 && x != 1 && x != n - 1) return false;
      x = y;
    }
    if (y != 1) return false;
  }
  return true;
}
long long pollard_rho(long long n, int c) {
  long long x, y, d, i = 1, k = 2;
  x = rand() % (n - 1) + 1;
  y = x;
  while (true) {
    i++;
    x = (muti_mod(x, x, n) + c) % n;
    d = gcd(y - x, n);
    if (1 < d && d < n) return d;
    if (y == x) return n;
    if (i == k) {
      y = x;
      k <<= 1;
    }
  }
}
void findFactor(long long n, int k) {
  if (n == 1) return;
  if (miller_rabin(n, 6)) {
    factor[++fac_top] = n;
    return;
  }
  long long p = n;
  while (p >= n) p = pollard_rho(p, k--);
  findFactor(p, k);
  findFactor(n / p, k);
}
struct data {
  long long p;
  int cnt;
  data() {}
  data(long long _p, int _c) {
    p = _p;
    cnt = _c;
  }
} fac[100];
bool comp(data a, data b) { return a.p < b.p; }
vector<long long> ans;
int top;
void dfs(int k, long long res) {
  if (k == top) {
    long long tmp = orn / res - res / 2 + 1, lbt = tmp & (-tmp);
    if (tmp == lbt && tmp != 0) {
      ans.push_back(res * tmp);
    }
  } else {
    for (int i = 0; i <= fac[k].cnt; i++) {
      dfs(k + 1, res);
      res *= fac[k].p;
    }
  }
}
int main() {
  srand(time(0));
  long long n;
  scanf("%I64d", &orn);
  fac_top = -1;
  n = orn;
  findFactor(n, 107);
  top = 0;
  for (int i = 0; i <= fac_top; i++) {
    long long pr = factor[i];
    if (n % pr == 0) {
      int cnt = 0;
      while (n % pr == 0) {
        n /= pr;
        cnt++;
      }
      fac[top++] = data(pr, cnt);
    }
  }
  sort(fac, fac + top, comp);
  ans.clear();
  if (fac[0].p == 2) {
    dfs(1, 1);
  } else {
    dfs(0, 1);
  }
  sort(ans.begin(), ans.end());
  if (ans.size() == 0) {
    puts("-1");
  } else {
    for (int i = 0; i < ans.size(); i++) {
      printf("%I64d\n", ans[i]);
    }
  }
  return 0;
}
