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.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.io.BufferedReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.io.InputStream;

import java.util.Set;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        BufferedReader in = new BufferedReader( new InputStreamReader( inputStream ) ); 
        PrintWriter out = new PrintWriter(outputStream);
        TaskAA solver = new TaskAA();
        solver.solve(in, out);
        in.close();
        out.close();
    }
}



/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 */

class TaskAA {
    static class Student implements Comparable<Student> {
        int when;
        int who;

        Student(int when, int who) {
            this.when = when;
            this.who = who;
        }

        public int compareTo(Student student) {
            return when - student.when;
        }
    }
    
    static Set<Long> triNumbers = new HashSet<Long>(); 
    
    public void solve(BufferedReader in, PrintWriter out) throws IOException{
        
        int n = Integer.parseInt( in.readLine() );
        if(triNumbers.size() ==0)   
            for(long i = 1; i < 1e5; i++){
                triNumbers.add((i+1)*i/2);
            }
        for(long i = 1; i < 1e5; i++){
            long s = (i+1)*i/2;
            if(triNumbers.contains(n-s)){
                out.println("YES");
                return;
            }
        }
        out.println("NO");
        
    }
}