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.util.*;
import java.io.*;

public class AiseHi {
	static class FastReader
	{
	BufferedReader br;
	StringTokenizer st;

	public FastReader()
	{
	br = new BufferedReader(new
	InputStreamReader(System.in));
	}

	String next()
	{
	while (st == null || !st.hasMoreElements())
	{
	try
	{
	st = new StringTokenizer(br.readLine());
	}
	catch (IOException e)
	{
	e.printStackTrace();
	}
	}
	return st.nextToken();
	}

	int nextInt()
	{
	return Integer.parseInt(next());
	}

	long nextLong()
	{
	return Long.parseLong(next());
	}

	double nextDouble()
	{
	return Double.parseDouble(next());
	}

	String nextLine()
	{
	String str = "";
	try
	{
	str = br.readLine();
	}
	catch (IOException e)
	{
	e.printStackTrace();
	}
	return str;
	}
	}
	static int m = (int)(1e9+9);
	static long mod(long x) {
		return ((x%m + m)%m);
	}
	static long add(long a,long b) {
		return mod(mod(a)+mod(b));
	}
	static long mul(long a,long b) {
		return mod(mod(a) * mod(b));
	}
	
	public static void main (String[] args) {
		FastReader sc = new FastReader();
		int t = 1;
//		t = sc.nextInt();
		outer : while(t-->0) {
			int n = sc.nextInt();
			boolean is = false;
			for(int i=1;i<n;i++) {
				long x = (i*(i+1))/2;
				if(x>n) break;
				else {
					x = n - x;
				}
				long l = i,h = n,ans = -1;
				while(l<=h) {
					long mid = l+(h-l)/2;
					long temp = (mid*(mid+1))/2;
					if(temp==x) {
						ans = mid;
						break;
					}
					else if(temp>x) h=mid-1;
					else l = mid+1;
				}
				if(ans!=-1) {
					is = true;
					break;
				}
			}
			if(is) System.out.println("Yes");
			else System.out.println("No");
		}
	}
	static long lstbt(long val) {
		long msk = val & (val-1);
		return (long) (Math.log(val^msk)/Math.log(2));
	}
	private static long sqrt(long x) {
		long l = 1,h = x;
		long ans = 0;
		while(l<=h) {
			long mid = (l+(h-l)/2);
			if(mid>x/mid) h = mid-1;
			else {
				ans = mid;
				l = mid+1;
			}
		}
		return ans;
	}
	static boolean prime[] = new boolean[10000001];
	static void sieve() {
		prime[0] = true;
		prime[1] = true;
		int max = 10000000;
		for(int i=2;i*i<=max;i++) {
			if(!prime[i]) {
				for(int j=i*i;j<=max;j+=i)
					prime[j] = true;
			}
		}
	}
	static String reverse(String x) {
		StringBuilder input1 = new StringBuilder();
		
        input1.append(x);
        
        input1 = input1.reverse();
        
        return input1.toString();
	}
	static int gcd(int val, int g) {
		if(g==0) return val;
		
		return gcd(g,val%g);
	}
}
class pair{
	long a;
	long b;
	pair(long a,long b){
		this.a = a;
		this.b = b;
	}
}