Problem:
Score : 700 points

Problem Statement

You are given an integer N. Determine if there exists a tree with 2N vertices numbered 1 to 2N satisfying the following condition, and show one such tree if the answer is yes.

Assume that, for each integer i between 1 and N (inclusive), Vertex i and N+i have the weight i. Then, for each integer i between 1 and N, the bitwise XOR of the weights of the vertices on the path between Vertex i and N+i (including themselves) is i.

Constraints

N is an integer.

1 \leq N \leq 10^{5}

Input

Input is given from Standard Input in the following format:

N

Output

If there exists a tree satisfying the condition in the statement, print Yes; otherwise, print No.
Then, if such a tree exists, print the 2N-1 edges of such a tree in the subsequent 2N-1 lines, in the following format:

a_{1} b_{1}
\vdots
a_{2N-1} b_{2N-1}

Here each pair (a_i, b_i) means that there is an edge connecting Vertex a_i and b_i. The edges may be printed in any order.

Sample Input 1

3

Sample Output 1

Yes
1 2
2 3
3 4
4 5
5 6

The sample output represents the following graph:

Sample Input 2

1

Sample Output 2

No

There is no tree satisfying the condition.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int,int> P;

bool ok(int n){
  bool ans=false;
  while(n>1){
    if(n%2==1) ans=true;
    n/=2;
  }
  return ans;
}

int main(){
  int n;
  cin >> n;
  if(!ok(n)) cout << "No" << endl;
  else{
    cout << "Yes" << endl;
    int now=0;
    int a[2*n-1],b[2*n-1];
    int s=(n-3)/4*4+3;
    for(int i=0;i<s-1;i++){
      a[now]=i; b[now]=i+1;
      now++;
    }
    a[now]=s-1; b[now]=n;
    now++;
    for(int i=0;i<s-1;i++){
      a[now]=n+i; b[now]=n+i+1;
      now++;
    }
    if(n%4==1||n%4==2){
      a[now]=0; b[now]=s; now++;
      a[now]=s; b[now]=s+1; now++;
      a[now]=0; b[now]=n+s+1; now++;
      a[now]=n+s+1; b[now]=n+s; now++;
    }
    if(n%4==2){
      a[now]=1; b[now]=n-1; now++;
      a[now]=2*n-2; b[now]=2*n-1; now++;
    }
    if(n%4==0){
      int x,y;
      for(int i=30;i>=0;i--){
        if(n&(1<<i)){
          x=i; break;
        }
      }
      for(int i=x-1;i>=0;i--){
        if(n&&(1<<i)){
          y=i; break;
        }
      }
      x=(1<<x);
      y=(1<<y);
      b[y-1]=x-1; a[y]=x-1;
      b[x-2]=y; a[x-1]=y;
      b[s+y-1]=n+x-1; a[s+y]=n+x-1;
      b[s+x-2]=n+y; a[s+x-1]=n+y;
      a[now]=y-1; b[now]=n-1; now++;
      a[now]=x-1; b[now]=2*n-1; now++;
    }
    for(int i=0;i<2*n-1;i++){
      cout << a[i]+1 << ' ' << b[i]+1 << endl;
    }
  }
}