#include <iostream>
#include <vector>
using namespace std;
struct point{
    int x;
    int y;
    point(int a=0,int b=0):x(a),y(b){}
};

bool test(vector<point> &field,int &x,int &y){
    bool result=false;
    for(const point& a:field){
        if(a.x==x&&a.y==y){
            result=true;break;}
    }
    return result;
}

int main() {
    point B, hourse;
    int i,j,cur,prev;
    long fromLeft,fromTop;
    cin>>B.x>>B.y>>hourse.x>>hourse.y;
    vector<point> horseField={{hourse.x,hourse.y}};
    for(i=0;i<8;++i){
        if(hourse.x+((i%2?1:2))*(i<4?1:-1)<=B.x && 
        hourse.y+((i%2?2:1))*(i %4 < 2? 1:-1)<=B.y
        )horseField.push_back({hourse.x+((i%2?1:2))*(i<4?1:-1),hourse.y+((i%2?2:1))*(i %4 < 2? 1:-1)});
    }
    vector<vector<long long>> dp(2,vector<long long >(B.x+1));//代表到当面格的路径数
    dp[0][0]=1;
    for(i=0;i<=B.y;++i){
        cur=i%2;
        prev=(i-1)%2;
        for(j=i?0:1;j<dp[0].size();++j){
            if(test(horseField,j,i)){
                //当前点为马或者马的攻击范围
                dp[cur][j]=0;
                
            }else{
                fromTop=i>0? dp[prev][j]:0;
                fromLeft=j>0? dp[cur][j-1]:0;
                dp[cur][j]=fromTop+fromLeft;
                
            }
        }
    };
    cout<<dp[cur][--j]<<endl;
    

}
// 64 位输出请用 printf("%lld")