// #define _GLIBCXX_DEBUG // for STL debug (optional)
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
#include <bitset>
using namespace std;
using ll = long long int;
using int64 = long long int;
 
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}
 
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
const int INF = 1LL << 29;
const ll LONGINF = 1LL << 60;
const ll MOD = 1000000007LL;

void test(int N) {
    vector<int> vec(2*N);
    for(int i=0; i<2*N; i+=2) {
        vec[i] = vec[i+1] = i/2 + 1;
    }
    do {
        vector<int> L(N+1, INF), R(N+1, -INF);
        for(int i=0; i<2*N; i++) {
            chmin(L[ vec[i] ], i);
            chmax(R[ vec[i] ], i);
        }

        bool ok = true;
        for(int i=1; i<=N; i++) {
            int x = 0;
            for(int j=L[i]; j<=R[i]; j++) {
                x ^= vec[j];
            }
            ok &= (x == i);
        }
        if(ok) {
            for(auto e : vec) cerr << e << " ";
            cerr << endl;
            return;
        }
    }while(next_permutation(vec.begin(), vec.end()));
}

void verify(int N, vector<int> res) {
    vector<int> L(N+1, INF), R(N+1, -INF);
    for(int i=0; i<2*N; i++) {
        int num = res[i] % N == 0 ? N : res[i] % N;
        chmin(L[ num ], i);
        chmax(R[ num ], i);
    }

    for(int i=1; i<=N; i++) {
        int x = 0;
        for(int j=L[i]; j<=R[i]; j++) {
            int num = res[j] % N == 0 ? N : res[j] % N;
            x ^= num;
        }
        assert(x == i);
    }
}

int msb(int N) {
    int m = -1;
    while(N) m++, N >>= 1;
    return m;
}

void solve(int N) {
    int m0 = msb(N), m1 = msb(N-1);
    if(m0 != m1) {
        puts("No");
        return;
    }

    if(N % 4 != 0) {
        vector<int> res;
        for(int i=4; i<=N; i+=4) {
            if(i+3 > N) break;
            for(int j=0; j<4; j++) res.emplace_back(i+j);
            for(int j=0; j<4; j++) res.emplace_back(N+i+j);
        }

        vector<int> ord = {2, 3, 1};
        for(int i=0; i<3; i++) res.emplace_back(ord[i]);
        for(int i=0; i<3; i++) res.emplace_back(N+ord[i]);

        puts("Yes");
        for(size_t i=0; i+1<res.size(); i++) {
            printf("%d %d\n", res[i], res[i+1]);
        }

        if(N % 4 != 3) {
            int D = N / 4 * 4, M = res.size();
            if(N % 4 >= 1) {
                printf("%d %d\n", D, D+1);
                printf("%d %d\n", res[M-1], D);
                printf("%d %d\n", res[M-1], N+D+1);
                printf("%d %d\n", N+D+1, N+D);
            }
            if(N % 4 >= 2) {
                printf("%d %d\n", D, D+2);
                printf("%d %d\n", res[M-2], N+D+2);
            }
        }

        // verify(N, res);
    }
    else {
        puts("Yes");
        int A = N ^ (1 << m0), B = N - A;
        // fprintf(stderr, "A = %d, B = %d\n", A, B);
        vector<int> res, va, vb;
        vector<int> ord = {2, 3, 1};
        for(int i=0; i<3; i++) res.emplace_back(ord[i]);
        for(int i=0; i<3; i++) res.emplace_back(N+ord[i]);

        for(int i=4; i<=N; i+=4) {
            if(i+3 > N) break;
            vector<int> v;
            for(int j=0; j<4; j++) v.emplace_back(i+j);
            for(int j=0; j<4; j++) v.emplace_back(N+i+j);
            if(i == A) {
                reverse(v.begin(), v.end());
                va = v;
            }
            else if(i == B) {
                vb = v;
            }
            else {
                for(auto e : v) res.emplace_back(e);
            }
        }

        for(auto e : va) res.emplace_back(e);
        for(auto e : vb) res.emplace_back(e);

        for(size_t i=0; i+1<res.size(); i++) {
            printf("%d %d\n", res[i], res[i+1]);
        }
        printf("%d %d\n", A, N);
        printf("%d %d\n", B, N+N);
    }
}

int main() {
    int N; scanf("%d", &N);
    // test(N);
    solve(N);
    return 0;
}


Measured memory_bytes: 3700