#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace __gnu_pbds;

#if !ONLINE_JUDGE
#define debug
#endif

using namespace std;
 
/*******  All Required define Pre-Processors and typedef Constants *******/
#define mem(a, b) memset(a, (b), sizeof(a))
#define repd(i,k) for(int i=k;i>=0;i--)
#define rep(i,k) for(int i=0;i<k;i++)
#define repn(i,k1,k2) for(ll i=k1;i<k2;i++)
#define sz(x) (ll)(x).size()
#define ff first
#define ss second

#define all(cont) cont.begin(), cont.end()
#define rall(cont) cont.end(), cont.begin()
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define INF (int)1e9
#define EPS 1e-9
#define PI 3.1415926535897932384626433832795
#define MOD 1000000007
#define ee6 (ll)1000001
#define ee5 (ll)100001

#define trav(a, v) for(auto& a : v)

#define tt ll t;cin>>t; while(t--)
typedef long long int ll;
 
typedef pair<ll, ll> pr;
typedef vector<ll> vi;
typedef vector<string> vs;
typedef vector<pr> vpr;
typedef vector<vpr>vvpr;
typedef vector<vi> vvi;

//*X.find_by_order(2) element at index=2
//X.order_of_key(1) how many elements strictly less than 1

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
    tree_order_statistics_node_update>;

#ifdef debug
#define dbg(...) { cerr<<"[ "; dump(#__VA_ARGS__, __VA_ARGS__);}
#undef endl
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const pair<Arg1,Arg2> &x) {
    return out<<"("<<x.ff<<","<<x.ss<<")";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const vector<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const set<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const unordered_map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
} 
 
template <typename Arg1>
void dump(const string name, Arg1&& arg1){
    cerr << name << " : " << arg1 << " ] " << endl;
}
 
template <typename Arg1, typename... Args>
void dump(const string names, Arg1&& arg1, Args&&... args){
    const string name = names.substr(0,names.find(','));
    cerr<<name<<" : "<<arg1<<" | ";
    dump(names.substr(1+(int)name.size()), args...);
}
#else
    #define dbg(args...)
#endif
 
ll powmod(ll x, ll y) 
{ 
    ll res = 1;  
    x = x % MOD;
    while (y > 0) 
    { 
        if (y & 1) 
            res = (res*x) % MOD; 
        y = y>>1; // y = y/2 
        x = (x*x) % MOD;   
    } 
    return res; 

} 

void merge(vector<int>&temp,int low,int high,int &inv){
    vector<int>aux;
    int mid=(low+high)/2;
    int l1=low,r1=mid;
    int l2=mid+1,r2=high;
    while(l1<=r1 and l2<=r2){
        if(temp[l1]<temp[l2])
            aux.pb(temp[l1++]);
        else 
            {aux.pb(temp[l2++]);inv+=r1-l1+1;}
    }

    while(l1<=r1)
        aux.pb(temp[l1++]);    
    while(l2<=r2)
        aux.pb(temp[l2++]);

    for(int i=low;i<=high;i++)
        temp[i]=aux[i-low];
}

void mergesort(vector<int>&temp,int low,int high,int &inv){
    if(low==high)
        return;
    int mid=(low+high)/2;
    mergesort(temp,low,mid,inv);
    mergesort(temp,mid+1,high,inv);
    merge(temp,low,high,inv); 
}
int calinv(vector<int>&v){
    int inv=0;
    mergesort(v,0,v.size()-1,inv);
    return inv;
}
int dp[2001][2001];
int costb[4001][2001];
int costw[4001][2001];
vector<pair<int,int> >H;
vector<pair<int,int> >white,black;
int posw[2005],posb[2005];
int main()
{
    #if !ONLINE_JUDGE
    //freopen("in.txt","r",stdin);
    #endif
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n;cin>>n;
    rep(i,n+n){
        char c;int a;cin>>c>>a;
        H.eb(c,a);
        if(c=='W')
            {white.eb(a,i);posw[a]=i;}
        else
            {black.eb(a,i);posb[a]=i;}
    }     
    
    vector<int>temp;
    for(auto e:white)
        temp.pb(e.ff);

    int ANS=calinv(temp);
    
    temp.clear();
    for(auto e:black)
        temp.pb(e.ff);

    ANS+=calinv(temp);

    //costb[i][j] //before or on position i howmany black > j 
    for(int i=0;i<n+n;i++){
        for(int c=0;c<=n;c++)
            costb[i][c]=(i?costb[i-1][c]:0);
        if(H[i].ff=='B')
            for(int c=H[i].ss-1;c>=0;c--)
                costb[i][c]++;             
    }
    for(int i=0;i<n+n;i++){
        for(int c=0;c<=n;c++)
            costw[i][c]=(i?costw[i-1][c]:0);
        if(H[i].ff=='W')
            for(int c=H[i].ss-1;c>=0;c--)
                costw[i][c]++;             
    }


    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            if(!i and !j){dp[i][j]=0;continue;}        
            else dp[i][j]=INF;
            if(i){
                dp[i][j]=min(dp[i][j],dp[i-1][j]+costb[posw[i]][j]);//before i how many black >j
            }
            if(j){
                dp[i][j]=min(dp[i][j],dp[i][j-1]+costw[posb[j]][i]);//before j how many white >i
            }
 
        }
    }
    cout<<dp[n][n]+ANS;
}

Measured memory_bytes: 78592