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:
//package Round_121;

import java.util.*;
import java.io.*;

import static java.lang.Math.*;

public class a {

    void solve() throws Exception {
        int n = in.nextInt();
        
        HashSet<Long> hash = new HashSet<Long>();
        long sum = 0;
        for (long i = 1; sum <= (int)1e9 + 1; i++){
            sum += i;
            hash.add(sum);
        }
        
        for (long x : hash){
            if (hash.contains(n - x)){
                out.println("YES");
                return;
            }
        }   
        out.println("NO");
        
    }

    FastScanner in;
    PrintWriter out;

    String input = "";
    String output = "";

    void run() {
        try {
            if (input.length() > 0) {
                in = new FastScanner(new BufferedReader(new FileReader(input)));
            } else
                in = new FastScanner(new BufferedReader(new InputStreamReader(
                        System.in)));
            if (output.length() > 0)
                out = new PrintWriter(new FileWriter(output));
            else
                out = new PrintWriter(System.out);

            solve();

            out.flush();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            out.flush();
            out.close();
        } finally {
            out.close();
        }
    }

    public static void main(String[] args) {
        new a().run();
    }

    class FastScanner {
        BufferedReader bf;
        StringTokenizer st;

        public FastScanner(BufferedReader bf) {
            this.bf = bf;
        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(bf.readLine());
            return st.nextToken();
        }

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

        public String nextLine() throws IOException {
            return bf.readLine();
        }

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

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

        public int[] readIntArray(int n) throws IOException {
            int[] array = new int[n];
            for (int i = 0; i < n; i++)
                array[i] = this.nextInt();
            return array;
        }

        public long[] readLongArray(int n) throws IOException {
            long[] array = new long[n];
            for (int i = 0; i < n; i++)
                array[i] = this.nextLong();
            return array;
        }

    }

}