import std.stdio, std.conv, std.string, std.array, std.range, std.algorithm, std.container;
import std.math, std.random, std.bigint, std.datetime, std.format;
void main(string[] args){ if(args.length > 1) if(args[1] == "-debug") DEBUG = 1; solve(); }
void log()(){ writeln(""); } void log(T, A ...)(T t, lazy A a){ if(DEBUG) write(t, " "), log(a); } bool DEBUG = 0; 
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }
// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- //
void solve(){
	int n = read.to!int;
	
	for(int k = 0, m = 1; m <= n; k += 1, m *= 2){ 
		if(m == n){
			"No".writeln;
			return;
		}
	}
	"Yes".writeln;
	
	int[2][] ans;
	int[int] memo; // n + i をつなげた親が memo[i]
	for(int k = 0, m = 1; m <= n; k += 1, m *= 2){ 
		if(m > 1) ans ~= [m / 2, m];
		
		ans ~= [n + m + 1, n + m];
		memo[m] = m;
		
		for(int i = m + 1; i < m * 2 && i <= n; i ++){
			ans ~= [m, i];
			if(i - m / 2 < m) ans ~= [i - m / 2, n + i], memo[i] = i - m / 2;
			else ans ~= [memo[i - m], n + i], memo[i] = memo[i - m];
		} 
	}
	
	foreach(an; ans){
		writeln(an[0], " ", an[1]);
	}
	
	
}
