Problem: Find out if it is possible to partition the first n positive integers into two non-empty disjoint sets S_1 and S_2 such that:

gcd(sum(S_1), sum(S_2)) > 1 

Here sum(S) denotes the sum of all elements present in set S and gcd means the[greatest common divisor](https://en.wikipedia.org/wiki/Greatest_common_divisor).

Every integer number from 1 to n should be present in exactly one of S_1 or S_2.

Input

The only line of the input contains a single integer n (1 ≤ n ≤ 45 000)

Output

If such partition doesn't exist, print "No" (quotes for clarity).

Otherwise, print "Yes" (quotes for clarity), followed by two lines, describing S_1 and S_2 respectively.

Each set description starts with the set size, followed by the elements of the set in any order. Each set must be non-empty.

If there are multiple possible partitions — print any of them.

Examples

Input

1


Output

No

Input

3


Output

Yes
1 2
2 1 3 

Note

In the first example, there is no way to partition a single number into two non-empty sets, hence the answer is "No".

In the second example, the sums of the sets are 2 and 4 respectively. The gcd(2, 4) = 2 > 1, hence that is one of the possible answers.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <typename T>
void scan(T &x) {
  x = 0;
  bool neg = 0;
  register T c = getchar();
  if (c == '-') neg = 1, c = getchar();
  while ((c < 48) || (c > 57)) c = getchar();
  for (; c < 48 || c > 57; c = getchar())
    ;
  for (; c > 47 && c < 58; c = getchar()) x = (x << 3) + (x << 1) + (c & 15);
  if (neg) x *= -1;
}
template <typename T>
void prll(T n) {
  bool neg = 0;
  if (n < 0) n *= -1, neg = 1;
  char snum[65];
  long long int i = 0;
  do {
    snum[i++] = n % 10 + '0';
    n /= 10;
  } while (n);
  --i;
  if (neg) putchar('-');
  while (i >= 0) putchar(snum[i--]);
  printf(" ");
}
int readint() {
  bool minus = false;
  long long int result = 0;
  char ch;
  ch = getchar();
  while (true) {
    if (ch == '-') break;
    if (ch >= '0' && ch <= '9') break;
    ch = getchar();
  }
  if (ch == '-')
    minus = true;
  else
    result = ch - '0';
  while (true) {
    ch = getchar();
    if (ch < '0' || ch > '9') break;
    result = result * 10 + (ch - '0');
  }
  if (minus)
    return -result;
  else
    return result;
}
long long int readll() {
  char r;
  bool start = false, neg = false;
  long long int ret = 0;
  while (true) {
    r = getchar();
    if ((r - '0' < 0 || r - '0' > 9) && r != '-' && !start) {
      continue;
    }
    if ((r - '0' < 0 || r - '0' > 9) && r != '-' && start) {
      break;
    }
    if (start) ret *= 10;
    start = true;
    if (r == '-')
      neg = true;
    else
      ret += r - '0';
  }
  if (!neg)
    return ret;
  else
    return -ret;
}
bool subsetSums(long long int arr[], long long int n, long long int k) {
  long long total = 1 << n;
  for (long long i = 0; i < total; i++) {
    long long sum = 0;
    for (long long int j = 0; j < n; j++)
      if (i & (1 << j)) sum += arr[j];
    if (sum == k) return true;
  }
  return false;
}
void solve() {
  long long int k;
  scan(k);
  long long int n = k % 25;
  long long int t = k / 25;
  string str = "abcdefghijklmnopqrstuvwxyz";
  if (n > 0) {
    string b = str.substr(0, n + 1);
    reverse(b.begin(), b.end());
    cout << b;
  }
  reverse(str.begin(), str.end());
  while (t--) {
    cout << str;
  }
  cout << '\n';
}
long long int phi(long long int n) {
  if (n == 1) return 2;
  long long int i;
  long long int result = n;
  for (i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      while (n % i == 0) n /= i;
      result -= result / i;
    }
  }
  if (n > 1) result -= result / n;
  return result;
}
bool checkprime(long long int n) {
  if (n == 1) return false;
  if (n == 2 || n == 3) return true;
  long long int i;
  for (i = 2; i * i <= n; i++) {
    if (n % i == 0) break;
  }
  if (i * i > n)
    return true;
  else
    return false;
}
bool lexicographical_compare(string s1, string s2) {
  for (long long int i = 0; i < min(s1.length(), s2.length()); i++) {
    if (s1[i] < s2[i]) return true;
    if (s1[i] > s2[i]) return false;
  }
  if (s1.length() <= s2.length()) return true;
}
long long int reverse(long long int n) {
  long long int sum = 0;
  long long int i = 0;
  long long int temp = n;
  long long int len = 0;
  while (temp > 0) {
    len++;
    temp /= 10;
  }
  while (n > 0) {
    sum += (n % 10) * pow(10, len - i - 1);
    i++;
    n /= 10;
  }
  return sum;
}
long long int power(long long int x, long long int y, long long int p) {
  long long int res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
long long int modularinverse(long long int a, long long int p) {
  return power(a, p - 2, p);
}
bool prime[1000001];
void sieve() {
  prime[1] = false;
  long long int i, j;
  for (i = 2; i <= 100000; ++i) {
    prime[i] = true;
  }
  for (i = 2; i * i <= 100000; ++i) {
    if (prime[i]) {
      for (j = 2; j * i <= 100000; ++j) prime[i * j] = false;
    }
  }
}
long long int digits(long long int n) {
  long long int count = 0;
  while (n > 0) {
    count++;
    n /= 10;
  }
  return count;
}
bool check(long long int n) {
  long long int count = 0;
  for (long long int i = 2; i <= sqrt(n); ++i) {
    if (n % i == 0 && checkprime(i)) {
      ++count;
    } else if (n % i == 0) {
      if (checkprime(n / i)) ++count;
    }
  }
  if (count >= 3)
    return true;
  else
    return false;
}
long long int gcd(long long int a, long long int b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
bool sortbysec(const pair<long long int, long long int> &a,
               const pair<long long int, long long int> &b) {
  return (a.second < b.second);
}
bool isLeapYear(long long int year) {
  if (year % 400 == 0)
    return true;
  else if (year % 100 == 0)
    return false;
  else if (year % 4 == 0)
    return true;
  else
    return false;
}
bool check(long long int x, long long int y) {
  map<long long int, long long int> fuck;
  map<long long int, long long int> fuckoff;
  while (x > 0) {
    fuck[x % 10]++;
    x /= 10;
  }
  while (y > 0) {
    fuckoff[y % 10]++;
    y /= 10;
  }
  bool ok = false;
  for (long long int i = 0; i < 10; i++) {
    if (fuck[i] > 0 && fuckoff[i] > 0) {
      ok = true;
      break;
    }
  }
  return ok;
}
bool check(string s1, string s2) {
  if (s2 == s1)
    return true;
  else if (s2.length() > s1.length())
    return false;
  long long int i = s1.length() - 1;
  long long int j = s2.length() - 1;
  for (; j >= 0; i--, j--) {
    if (s1[i] != s2[j]) break;
  }
  if (j == -1)
    return true;
  else
    return false;
}
bool checksquare(long long int n) {
  long long int ans = sqrt(n);
  if (ans * ans == n)
    return true;
  else
    return false;
}
long long int binarysearch(long long int a[], long long int low,
                           long long int high, long long int key) {
  while (low <= high) {
    long long int mid = low + (high - low) / 2;
    if (a[mid] == key)
      return mid;
    else if (a[mid] > key)
      high = mid - 1;
    else
      low = mid + 1;
  }
  return -1;
}
void suffixarray(string str, long long int m, long long int suffix[]) {
  long long int len = 0;
  long long int i;
  suffix[0] = 0;
  i = 1;
  while (i < m) {
    if (str[i] == str[len]) {
      len++;
      suffix[i] = len;
      i++;
    } else {
      if (len != 0) {
        len = suffix[len - 1];
      } else {
        suffix[i] = 0;
        i++;
      }
    }
  }
}
long long int KMP(string str) {
  long long int n = str.length();
  long long int suffix[n];
  suffixarray(str, n, suffix);
  long long int len = suffix[n - 1];
  if (len > 0 && n % (n - len) == 0)
    return n - len;
  else
    return 0;
}
long long triangle[100 + 1][100 + 1];
void makeTriangle() {
  long long int i, j;
  triangle[0][0] = 1;
  for (i = 1; i < 100; i++) {
    triangle[i][0] = 1;
    for (j = 1; j <= i; j++) {
      triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
    }
  }
}
long long combi(long long int n, long long int r) { return triangle[n][r]; }
bool crossproduct(long long int x1, long long int y1, long long int x2,
                  long long int y2) {
  if (x1 * y2 == x2 * y1)
    return true;
  else
    return false;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  if (n <= 2) {
    cout << "No";
    return 0;
  }
  cout << "Yes" << '\n';
  if (n % 2 == 0) {
    cout << n / 2 << " ";
    for (int i = 1; i <= n; i += 2) cout << i << " ";
    cout << '\n';
    cout << n / 2 << " ";
    for (int i = 2; i <= n; i += 2) cout << i << " ";
  } else {
    cout << (n + 1) / 2 << " ";
    for (int i = 1; i <= n; i += 2) cout << i << " ";
    cout << '\n';
    cout << (n - 1) / 2 << " ";
    for (int i = 2; i <= n; i += 2) cout << i << " ";
  }
}