#include <bits/stdc++.h>
using namespace std;
#define int long long
using vec_int = vector<int>;
using P = pair<int, int>;
using T = tuple<int,int,int>;
using T2 = tuple<int,int,int, int>;
using Q = tuple<int,int,int, int, int>;
using ll = long long;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)

void cout_line(vector<int> &a){
    for(int i=0;i<a.size();i++){
        if(i<a.size()-1){
            cout<<a.at(i)<<" ";
        }else{
            cout<<a.at(i)<<endl;
        }
    }
}

bool check(int start, int up_floor, map<int, int> &A_map, map<int, int> &B_map, int &wild_card){
    for(int i=start;i<start+up_floor;i++){
        int from = i;
        int to = i+up_floor;
        if(A_map.count(to)){
            return false;
        }
        if(B_map.count(from)){
            return false;
        }

        if((!A_map.count(from))&&(!B_map.count(to))){
            wild_card--;
            continue;
        }

        if(A_map.count(from)){
            if(A_map[from]!=-1 && A_map[from]!=to){
                return false;
            }
        }
        if(B_map.count(to)){
            if(B_map[to]!=-1 && B_map[to]!=from){
                return false;
            }
        }

    }
    if(wild_card<0){
        return false;
    }

    return true;
}


signed main(){
    int N; cin>>N;
    vec_int A(N); 
    vec_int B(N); 
    rep(i,N)cin>>A.at(i)>>B.at(i);
    map<int, int> A_map;
    rep(i,N)if(A.at(i)!=-1)A_map[A.at(i)]=B.at(i);

    map<int, int> B_map;
    rep(i,N)if(B.at(i)!=-1)B_map[B.at(i)]=A.at(i);

    int wild_card = 0;
    rep(i,N)if(A.at(i)==-1&&B.at(i)==-1)wild_card++;


    rep(i,N){
        if(A.at(i)>=0&&B.at(i)>=0){
            if(A.at(i)>=B.at(i)){
                cout<<"No"<<endl;
                return 0;
            }
        }
    }
    set<int> num_set;
    rep(i,N){
        if(A.at(i)!=-1){
            if(num_set.count(A.at(i))){
                cout<<"No"<<endl;
                return 0;
            }else{
                num_set.insert(A.at(i));
            }
        }
        if(B.at(i)!=-1){
            if(num_set.count(B.at(i))){
                cout<<"No"<<endl;
                return 0;
            }else{
                num_set.insert(B.at(i));
            }
        }

    }


    set<P> start_set;

    queue<P> que;
    que.emplace(1, wild_card);

    while(!que.empty()){
        int start_floor, count; tie(start_floor, count) = que.front(); que.pop(); //start_floorは必ず奇数

        int max_up = (2*N-start_floor+1)/2; 
        for(int i=1;i<=max_up;i++){
            int num = count;
            if(check(start_floor, i, A_map, B_map, num)){
                if(i==max_up){
                    cout<<"Yes"<<endl;
                    return 0;
                }
                int next = start_floor+i*2;
                if(!start_set.count(make_pair(next, num))){
                    start_set.insert(make_pair(next,num));
                    que.emplace(next,num);
                }
            }
        }
    }
    cout<<"No"<<endl;



    return 0;
}
#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <tuple>
#include <string>
#include <list>
#include <map>
using namespace std;

long long int min(long long int a,long long int b){
    if(a>b){
        return b;
    }else{
        return a;
    }
}

long long int max(long long int a,long long int b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}

long long modpow(long long a, long long n, long long mod) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

// a^{-1} mod を計算する
long long modinv(long long a, long long mod) {
    return modpow(a, mod - 2, mod);
}

void f(vector<vector<int>>& a,vector<vector<int>>& b,int N,int K){
    for(int i=0;i<N-1;i++){
        for(int j=i+1;j<N;j++){
            int l=0;
            for(int k=0;k<N;k++){
                if(a[k][i]+a[k][j]>K){
                    break;
                }
                l+=1;
            }
            if(l==N){
                b[i][j]=1;
                b[j][i]=1;
            }
        }
    }
}

void g(vector<vector<int>>& a,vector<vector<int>>& c,int N,int K){
    for(int i=0;i<N-1;i++){
        for(int j=i+1;j<N;j++){
            int l=0;
            for(int k=0;k<N;k++){
                if(a[i][k]+a[j][k]>K){
                    break;
                }
                l+=1;
            }
            if(l==N){
                c[i][j]=1;
                c[j][i]=1;
            }
        }
    }
}

int h(vector<vector<int>>& b,vector<int>& x,int N){
    int M=1;
    vector<int> a(N);
    for(int i=0;i<N;i++){
        a[i]=0;
    }
    stack<int> d;
    for(int i=0;i<N;i++){
        int j=0;
        if(a[i]==0){
            d.push(i);
            a[i]=1;
        }
        while(!d.empty()){
            int k=d.top();
            d.pop();
            j+=1;
            for(int l=0;l<N;l++){
                if(b[k][l]==1 && a[l]==0){
                    d.push(l);
                    a[l]=1;
                }
            }
        }
        if(j>1){
            x.push_back(j);
            M=max(M,j);
        }
    }
    return M;
}


int main(){
    int a,b,x,y;
    cin>>a>>b>>x>>y;
    if(a==b){
        cout<<x<<endl;
    }else{
        int ans=0;
        if(a>b){
            ans+=x;
            a=a-1;
        }else{
            ans+=x;
        }
        if(y>2*x){
            ans+=2*x*abs(a-b);
        }else{
            ans+=y*abs(a-b);
        }
        cout<<ans<<endl;
    }
    return 0;
}