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.lang.*;

public class FunkyNum{

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		int n = in.nextInt();

		int i = 1;

		int sum = 0;

		ArrayList<Integer> list = new ArrayList<Integer>();

		while(sum <= n)
		{
			sum+=i;
			list.add(sum);
			i++;
		}


		if(list.get(list.size() - 1) == n)
		{
			System.out.println("YES");
			return;
		}

		for(i = 0 ; i < list.size() ; i++){

			int cur = list.get(i);
			int target = n - cur;

			if(binary(list,target))
			{
				System.out.println("YES");
				return;
			}


		}

		System.out.println("NO");
			return;

}

static boolean binary(ArrayList<Integer> arr, int target){

	int start = 0;
	int end = arr.size() - 1;

	while(start <= end){

		int mid = start + (end - start) / 2;

		if(arr.get(mid) == target)
			return true;
		else if(arr.get(mid) < target)
			start = mid + 1;
		else
			end = mid - 1;
	}

	return false;
}
}