You are given two integers n and k. Your task is to find if n can be represented as a sum of k distinct positive odd (not divisible by 2) integers or not.

You have to answer t independent test cases.

Input

The first line of the input contains one integer t (1 ≤ t ≤ 10^5) — the number of test cases.

The next t lines describe test cases. The only line of the test case contains two integers n and k (1 ≤ n, k ≤ 10^7).

Output

For each test case, print the answer — "YES" (without quotes) if n can be represented as a sum of k distinct positive odd (not divisible by 2) integers and "NO" otherwise.

Example

Input


6
3 1
4 2
10 3
10 2
16 4
16 5


Output


YES
YES
NO
YES
YES
NO

Note

In the first test case, you can represent 3 as 3.

In the second test case, the only way to represent 4 is 1+3.

In the third test case, you cannot represent 10 as the sum of three distinct positive odd integers.

In the fourth test case, you can represent 10 as 3+7, for example.

In the fifth test case, you can represent 16 as 1+3+5+7.

In the sixth test case, you cannot represent 16 as the sum of five distinct positive odd integers.
import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Solution
{
     static class Pair<A,B>{
        A parent;
        B rank;
        Pair(A parent,B rank)
        {
            this.rank=rank;
            this.parent=parent;
        }
    }
//    static int find(Pair pr[],int i)
//    {
//        if(i==pr[i].parent)
//            return i;
//        else
//        {
//            pr[i].parent=find(pr,pr[i].parent);
//            return pr[i].parent;
//        }
//    }
//    static void join(Pair[] pr,int i,int j)
//    {
//        i=find(pr,i);
//        j=find(pr,j);
//        if(i==j)
//            return;
//        if(pr[i].rank>=pr[j].rank)
//        {
//            pr[j].parent=i;
//            pr[i].rank+=pr[j].rank;
//        }
//        else
//        {
//            pr[i].parent = j;
//            pr[j].rank+=pr[i].rank;
//        }
//    }
    static void swap(char ar[],int i,int j)
    {
        char f = ar[i];
        ar[i]=ar[j];
        ar[j]=f;
    }
    static ArrayList<Integer> graph[];
    static int ans=0;
     static long powers(long n) 
    { 
        int MOD=1000000007;
        if (n <= 1) { 
            return 1; 
        }
        n--;
  
        // This is an identity matrix. 
        long res[][] = { { 1, 0 }, { 0, 1 } }; 
  
        // this is Transformation matrix. 
        long tMat[][] = { { 2, 2 }, { 1, 0 } };
        while (n > 0) { 
            if (n % 2 == 1) { 
                long tmp[][] = new long[2][2]; 
                tmp[0][0] = ((res[0][0] * tMat[0][0])%MOD 
                             + (res[0][1] * tMat[1][0])%MOD) 
                            %MOD;
                tmp[0][1] = ((res[0][0] * tMat[0][1])%MOD 
                             + (res[0][1] * tMat[1][1])%MOD) 
                            %MOD; 
                tmp[1][0] = ((res[1][0] * tMat[0][0])%MOD 
                             + (res[1][1] * tMat[1][0])%MOD) 
                            % MOD; 
                tmp[1][1] = ((res[1][0] * tMat[0][1])%MOD 
                             + (res[1][1] * tMat[1][1])%MOD) 
                            % MOD;
                res[0][0] = tmp[0][0]; 
                res[0][1] = tmp[0][1]; 
                res[1][0] = tmp[1][0]; 
                res[1][1] = tmp[1][1]; 
            } 
  
            n = n / 2; 
            long tmp[][] = new long[2][2]; 
            tmp[0][0] = ((tMat[0][0] * tMat[0][0])%MOD 
                         + (tMat[0][1] * tMat[1][0])%MOD) 
                        % MOD; 
            tmp[0][1] = ((tMat[0][0] * tMat[0][1])%MOD 
                         + (tMat[0][1] * tMat[1][1])%MOD) 
                        % MOD; 
            tmp[1][0] = ((tMat[1][0] * tMat[0][0])%MOD 
                         + (tMat[1][1] * tMat[1][0])%MOD) 
                        % MOD; 
            tmp[1][1] = ((tMat[1][0] * tMat[0][1])%MOD 
                         + (tMat[1][1] * tMat[1][1])%MOD) 
                        % MOD; 
            tMat[0][0] = tmp[0][0]; 
            tMat[0][1] = tmp[0][1]; 
            tMat[1][0] = tmp[1][0]; 
            tMat[1][1] = tmp[1][1]; 
        }
        return ((res[0][0]*6)%MOD + (res[0][1] * 2) % MOD)%MOD; 
    }
    public static void main (String[] args) throws IOException
    {
        StringBuilder sb = new StringBuilder();
        FastReader s1 = new FastReader();
        int t=s1.I();
        int m=1000000007;
        while(t--!=0)
        {
            int n=s1.I();
            int k=s1.I();
            if(n%2==0 && k%2!=0)
                sb.append("NO\n");
            else if(n%2!=0 && k%2==0)
                sb.append("NO\n");
            else
            {
                long temp=(long)Math.pow(k, 2);
                if(temp>n)
                {
                    sb.append("NO\n");
                }
                else if(temp==n)
                {
                    sb.append("YES\n");
                }
                else
                {
                    sb.append("YES\n");
                }
            }
        }
        System.out.println(sb);
    }
     static void dfs(int index,int pc,int color[])
    {
        int c=0;
        BitSet bs= new BitSet(color.length+1);
        bs.set(color[index]);
        if(pc>=0)
        bs.set(pc);
        for(int i:graph[index])
        {
            if(color[i]==-1)
            {
                if(color[index]==c || pc==c)
                c=bs.nextClearBit(0);
                color[i]=c++;
                bs.set(c-1);
                dfs(i,color[index],color);
            }
        }
    }
    static void add1(TreeMap<Long,Integer> map,long key)
    {
        map.putIfAbsent(key, 0);
        map.replace(key, map.get(key)+1);
    }
    static void remove1(TreeMap<Long,Integer> map,long key)
    {
        map.replace(key, map.get(key)-1);
        if(map.get(key)==0)
            map.remove(key);
    }
    static void print(int h[])
    {
        for(int I:h)
            System.out.print(I+" ");
        System.out.println("");
    }
        static String preprocess(String s)
    {
        StringBuilder sb = new StringBuilder();
        sb.append("@#");
        for(int i=0;i<s.length();i++)
        {
            sb.append(s.charAt(i)).append("#");
        }
        sb.append("$");
        return sb.toString();
    }
    static String LPS(String s)
    {
        String snew = preprocess(s);
        int n = snew.length();
//        System.out.println(snew);
        int c = 0,r = 0;
        int maxlen = 0;
        int index=0;
        int len[] = new int[n];
        for(int i=1;i<n-1;i++)
        {
            int mirr = c-(i-c);
            if(i<r)
            {
                len[i]=Math.min(len[mirr],r-i);
            }
      //      System.out.println(i+" ");
            while(snew.charAt(i+len[i])==snew.charAt(i-len[i]))
                len[i]++;
            if(i+len[i]>r)
            {
                c = i;
                r = i+len[i];
            }
//            System.out.println(c+" "+i+" "+snew.charAt(i)+" "+len[i]+" "+maxlen+" "+index);
            if(len[i]>maxlen)
            {
//                System.out.println("inside");
                maxlen = len[i];
                index = i;
            }
        }
        maxlen--;
        int left = (index-maxlen-1)/2;
        int right = left+maxlen;
        return s.substring(left, right);
    }
    static void phi(int n,HashMap<Integer,Integer> hm)
    {
        int large=0;
        for(int i=2;i<=Math.sqrt(n);i++)
        {
            if(n%i==0)
            {
                if(i>large)
                {
                    large=i;
                }
            }
            while(n%i==0)
            {
                n=n/i;
            }
        }
        if(n>1)
        {
            if(n>large)
                large=n;
        }
        hm.putIfAbsent(large, 0);
        hm.replace(large, hm.get(large)+1);
    }
    static ArrayList<Integer> primeFactor(int n)
    {
        ArrayList<Integer> ans = new ArrayList<>();
        if(n%2==0)
            ans.add(2);
        while (n%2==0)
        {   
            n /= 2;
        }
        for (int i = 3; i <= Math.sqrt(n); i+= 2)
        {
            if(n%i==0)
                ans.add(i);
            while (n%i == 0)
            {
                n /= i;
            }
        }
        if (n > 2)
            ans.add(n);
        return ans;
    }
    static int longestSubSeg(int a[], int n,int k)
    {
        int cnt0 = 0;
        int l = 0;
        int max_len = 0;
        for (int i = 0; i < n; i++) {
            if (a[i] == 0)
                cnt0++;
            while (cnt0 > k) {
                if (a[l] == 0)
                    cnt0--;
                l++;
            }
            max_len = Math.max(max_len, i - l + 1);
        }
        
        return max_len;
    }
    static int binary(int left,int right,int ar[],int no)
    {
        int mid=(left+right)/2;
        if(Math.abs(right-left)<=1)
        {
            if(no>=ar[right])
            {
                return right+1;
            }
            else if(no<ar[left])
            {
                return left;
            }
            else
            {
                return left+1;
            }
        }
        if(ar[mid]>no)
        {
            right=mid-1;
            return binary(left, right, ar, no);
        }
        else{
            left=mid;
            return binary(left, right, ar, no);
        }
    }
    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 I()
        {
            return Integer.parseInt(next());
        }
        
        long L()
        {
            return Long.parseLong(next());
        }
        
        double D()
        {
            return Double.parseDouble(next());
        }
        
        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return str;
        }
    }
    static long gcd(long a,long b)
    {
        if(a%b==0)
            return b;
        return gcd(b,a%b);
    }
    static float power(float x, int y)
    {
        float temp;
        if( y == 0)
            return 1;
        temp = power(x, y/2);
        
        if (y%2 == 0)
            return temp*temp;
        else
        {
            if(y > 0)
                return x * temp * temp;
            else
                return (temp * temp) / x;
        }
    }
    static long pow(long x, long y)
    {
        int p = 1000000007;
        long res = 1;
        x = x % p;
        while (y > 0)
        {
            if((y & 1)==1)
                res = (res * x) % p;
            y = y >> 1;
            x = (x * x) % p;
        }
        return res;
    }
    static ArrayList<Integer> sieveOfEratosthenes(int n)
    {
        ArrayList<Integer> arr=new ArrayList<Integer>();
        boolean prime[] = new boolean[n+1];
        for(int i=2;i<n;i++)
            prime[i] = true;
        
        for(int p = 2; p*p <=n; p++)
        {
            if(prime[p] == true)
            {
                arr.add(p);
                for(int i = p*p; i <= n; i += p)
                    prime[i] = false;
            }
        }
        return arr;
    }
}