#include <iostream>
#include <iomanip>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
using T = tuple<int,int,int>;

#define eb emplace_back
#define pb push_back
#define MP make_pair
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
#define rep(i,j,n) for (int i = j; i < n; ++i)
#define repn(i,j,n) for (int i = j; i <= n; ++i)
#define revn(i,j,n) for (int i = j; i >= n; --i)
#define sz(i) i.size()
#define mem(i,v) memset(i,v,sizeof(i))
#define all(v) v.begin(), v.end()
#define endl '\n'
//#define int long long
#define INF 1e9
#define ss second
#define ff first

typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<int,pair<int,int>> piii;
 
string to_string(string s) { return '"' + s + '"';}
string to_string(char s) { return string(1, s);}
string to_string(const char* s) { return to_string((string) s);}
string to_string(bool b) { return (b ? "true" : "false");}
template <typename A> string to_string(A);
template <typename A, typename B>string to_string(pair<A, B> p) {return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";}
template <typename A> string to_string(A v) {bool f = 1; string r = "{"; for (const auto &x : v) {if (!f)r += ", "; f = 0; r += to_string(x);} return r + "}";}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {cerr << " " << to_string(H); debug_out(T...);}
#define pr(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

const int mod=1e9+7;
//const int mod=998244353;
const int up=1e5+10;
const int MAXN=1e5+10;

// int vis[MAXN],a[MAXN],dp[MAXN];
// vector<int>adj[MAXN];



// int32_t main(){
//     fast_cin();
//     int n,m,u,v;
//     cin>>n>>m;
//     repn(i,1,n){
//         dp[i]=1;
//         cin>>a[i];
//     }
//     mem(vis,0);
//     repn(i,1,m){
//         cin>>u>>v;
//         adj[u].pb(v);
//         adj[v].pb(u);
//     }
//     a[0]=a[1];
//     dfs(1,0);
//     int mx=0;
//     repn(i,1,n){
//         mx=max(mx,dp[i]);
//     }
//     cout<<mx<<endl;
// }

// int a[501],n,vis[501];
// vector<int>adj[501];
// void dfs(int u){
//     vis[u]=1;
//     cout<<u<<endl;
//     for(auto v:adj[u]){
//         if(!vis[v]){
//             dfs(v);
//         }
//     }
// }

// int find(int s,int e){
//     int mx=-1,ind;
//     repn(i,s,e){
//         if(mx<a[i]){
//             mx=a[i];
//             ind=i;
//         }
//     }
//     return ind;
// }

// int build(int s,int e){
//     if(e<s){
//         return 0;
//     }
//     if(s==e){
//         return s;
//     }
//     int mx=find(s,e);
//     cout<<mx<<endl;
//     if(1<=mx-1)
//     {
//         int x=build(s,mx-1);
//         adj[mx].pb(x);
//     }
//     if(mx+1<=n)
//     {
//         int y=build(mx+1,e);
//         adj[mx].pb(y);
//     }
//     return mx;
// }
// int32_t main()
// {
//     int n;
//     cin>>n;
//     repn(i,1,n){
//         cin>>a[i];
//     }
//     build(1,n);
//     mem(vis,0);
//     dfs(1);
// }   
// int32_t main()
// {
//     fast_cin();
//     int T;
//     //sieve();
//     cin>>T;
//     //T=1;
//     int t1=1;
//     while(true)
//     {
//         //cout<<"Case "<<t1<<": ";
//         solve();        
//         t1++;
//         if(t1>T)
//             break;
//     }
//     //cout<<ans<<endl;
// }

int32_t main()
{   
    int x,y;
    cin>>x>>y;
    if(y>=2*x && (y-2*x)%2==0)
    {
        int p=(y-2*x)/2;
        if(x>=p)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    else
    {
        cout<<"No"<<endl;
    }
}

Measured memory_bytes: 3624