Problem: As you very well know, this year's funkiest numbers are so called triangular numbers (that is, integers that are representable as <image>, where k is some positive integer), and the coolest numbers are those that are representable as a sum of two triangular numbers.

A well-known hipster Andrew adores everything funky and cool but unfortunately, he isn't good at maths. Given number n, help him define whether this number can be represented by a sum of two triangular numbers (not necessarily different)!

Input

The first input line contains an integer n (1 ≤ n ≤ 109).

Output

Print "YES" (without the quotes), if n can be represented as a sum of two triangular numbers, otherwise print "NO" (without the quotes).

Examples

Input

256


Output

YES


Input

512


Output

NO

Note

In the first sample number <image>.

In the second sample number 512 can not be represented as a sum of two triangular numbers.

Solution (in JAVA):

Solution:
import java.io.*;
		import java.util.*;
@SuppressWarnings("unused")
public class Main { //Название класса здесь
	private static boolean IOTypeIsFile = false; //Вид ввода/вывода. true-через файл. false-через консоль.
	private static String FileInput = ""; //Название файла ввода
	private static String FileOutput = "";//Название файла вывода
	private static Scanner in;
	private static PrintStream out,err;
	private static String ts(Object a) {return String.valueOf(a);}
	private static int ti(String a) {return Integer.valueOf(a);}
	private static double td(String a) {return Double.valueOf(a);}
	private static int[] arrayI(int n) {int[] ans = new int[n];
		for(int i = 0; i < n; ++i) {ans[i] = in.nextInt();}return ans;
	}
	private static String[] arrayS(int n) {String[] ans = new String[n];
		for(int i = 0; i < n; ++i) {ans[i] = in.next();}return ans;
	}
	private static double[] arrayD(int n) {double[] ans = new double[n];
		for(int i = 0; i < n; ++i) {ans[i] = in.nextDouble();}return ans;
	}
	private static void SomeVeryLargeUndUselessFunctionName() {if (!IOTypeIsFile) {err.print(FileInput+FileOutput);}}
	public static void main(String[] args) {
		err=new PrintStream(System.err);
		if(IOTypeIsFile) {
			File f = new File(FileInput);
			try {
				in = new Scanner(f);
				out = new PrintStream(FileOutput);
			} catch (FileNotFoundException var3) {System.err.println("404");}
		} else {
			in = new Scanner(System.in);
			out = new PrintStream(System.out);
		}
		run();
		in.close();
		out.close();
	}
	//Код пишут отсюда
	private static class C{
		int a;
		int b;
		public C(int a, int b){
			this.a = a;
			this.b = b;
		}
	}
	private static void run() {
		int n=in.nextInt();
		int[] t=new int[44720];
		for (int i=0;i<44720;i++) {t[i]=(i==0?0:t[i-1])+i+1;}
		for (int i:t) {
			if (Arrays.binarySearch(t,n-i)>=0) {out.println("YES");return;}
		}
		out.print("NO");
	}
}