#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define endl "\n"
#define rep(i, a, b) for (auto (i) = (a); (i) < (b); (i)++)
#define rrep(i, a, b) for (auto (i) = (a); (i) > (b); (i)--)

#define aim_cpo do{ios::sync_with_stdio(false);\
cin.tie(nullptr);cout.precision(12);cout<<fixed;}while(0)

#define LOCAL_INPUT do{FILE *stream1;\
stream1=freopen("/Users/aim_cpo/CLionProjects/competitive/in.txt","r",stdin);\
if(stream1==nullptr)return 0;}while(0)
#define LOCAL_OUTPUT do{FILE *stream2;\
stream2 = freopen("out.txt", "w", stdout);\
if (stream2 == nullptr) return 0;}while(0)

#ifdef LOCAL_DEFINE
#define show(x) cerr << #x << " = " << (x) << endl
#define dump(x) cerr << #x << " = " << (x) << " (line " << __LINE__ << ")" << endl
#define showV(v, n) do{\
for(int _i_t_e_=0; _i_t_e_<(n);_i_t_e_++)\
cerr<<"("<<_i_t_e_<<" = "<<(v)[_i_t_e_]<<") ";\
cerr<<endl;}while(0)
#define showA(a, n) do{\
for(int _i_t_e_=0;_i_t_e_<(n);_i_t_e_++)\
cerr<<"("<<_i_t_e_<<" = "<<(a)[_i_t_e_]<<") ";\
cerr<<endl;}while(0)
#define showA2(a, n, m) do{\
for(int _i_t_e_=0;_i_t_e_<(n);_i_t_e_++){\
for(int _i_t_e_2=0;_i_t_e_2<(m);_i_t_e_2++){\
cerr<<"("<<_i_t_e_<<", "<<_i_t_e_2<<" = "<<(a)[_i_t_e_][_i_t_e_2]<<") ";\
}cerr<<endl;}cerr<<endl;}while(0)
#else
#define show(x)
#define dump(x)
#define showV(v, n)
#define showA(a, n)
#define showA2(a, n, m)
#endif

typedef long long ll;
typedef unsigned long long ull;

constexpr const int INT_INF=0x3f3f3f3f; //1061109567
constexpr const ll LL_INF=0x3f3f3f3f3f3f3f3f; //4557430888798830399

template <typename T> bool chmin(T &a, T b){return a>b?(a=b,true):false;}
template <typename T> bool chmax(T &a, T b){return a<b?(a=b,true):false;}
template <typename T> void ln(T i, T n){cout<<(i==n-1?"\n":" ");}
template <typename T, typename S>
ostream &operator<<(ostream &out,const pair<T, S> &pair1){
  out<<'('<<pair1.fi<<", "<<pair1.se<<')';return out;}
template <typename T>
ostream &operator<<(ostream &out,const vector<T> &vector1){
  out<<'[';for(unsigned int i=0;i<vector1.size();i++){
    out<<vector1[i];if(i==vector1.size()-1)out<<"]";else out<<", ";
  }return out;
}

// INT
#define GCD(a, b) __gcd(a, b)
template <typename T> T LCM(T a, T b) {return a / GCD(a, b) * b;}
template <typename T> T EXTGCD(T a, T b, T& x, T& y) {
  T d = a;
  if (b != 0) {d=EXTGCD(b,a%b,y,x);y-=(a/b)*x;}
  else x=1,y=0;
  return d;
}
template <typename T> bool is_prime(T a) {
  for(int i=2;i*i<=a;i++)if(a%i==0)return 1;
  return 0;
}
template <typename T, typename S> T Pow(T a, S b) {
  T res = 1, now = a;
  while(b){if(b&1)res*=now;b>>=1;now*=now;}return res;
}

// MOD
ll MOD = 1000000000L + 7L;
#define add(a, b) ((a % MOD) + (b % MOD)) % MOD
#define mul(a, b) ((a % MOD) * (b % MOD)) % MOD
#define sub(a, b) ((a % MOD) + MOD - (b % MOD)) % MOD
template <typename T, typename S> T ModPow(T a, S b) {
  T res = 1, now = a;
  while(b){if(b&1)res=mul(res,now);b>>=1;now=mul(now,now);}return res;
}
template <typename T> T mod_inverse(T a, T mod, bool prime){ // if mod is prime, "prime" is true.
  if(prime)return ModPow(a, mod - 2);
  else{T x,y;EXTGCD(a,mod,x,y);return (mod+x%mod)%mod;}
}
#define divide(a, b) ((a % MOD) * (mod_inverse(b, MOD, true))) % MOD

//LLの数値をつかう時は最後にLをつける癖をつけよう
//
//  ┏┓┏┓　┓　┏┓
//  ┏┛┃┃　┃　┗┫
//  ┗┛┗┛　┻　┗┛
//
//   謹┃賀┃新┃年┃
//   ━┛━┛━┛━┛
//WWWWWWWWWWWWWWWWWWWWWW

template <typename T>
class BIT {
public:
    BIT(int size) {
      BITTable.assign(++size, 0);
    }
    T sum(int k) {
      T res = 0;
      for (++k; k > 0; k -= k & -k) {
        res += BITTable[k];
      }
      return res;
    }

    T sum(int l, int r) {
      if (l == 0) return sum(r);
      return sum(r) - sum(l - 1);
    }

    void update(int k, T x) { // b[k] += x;
      for (++k; k < (int)BITTable.size(); k += k & -k) BITTable[k] += x;
    }
private:
    vector <T> BITTable;
};

int n;
vector <pair <char, int> > v;
ll costB[2011][2011], costW[2011][2011];
ll dp[2011][2011];

int main() {
  aim_cpo; // インタラクティブのときは消すように.
#ifdef LOCAL_DEFINE
  LOCAL_INPUT; // インタラクティブのときは消すように.
//  LOCAL_OUTPUT; // ファイルに出力したいときのみ
  show(MOD);
#endif
  // テキトー考察
  //
  // まずはじめに、転倒数のお勉強から.
  // 転倒数は長さnのある数列Aが与えられたとき、0 <= i < j <= n - 1 && A[i] > A[j] となる(i, j)のペアの個数のこと
  // これは有名で、この転倒数の意味を少し一般的に見てみると、
  // 長さnのある数列Aが与えられたときの数列の状態を初期状態とし、最終的になるべき形になった数列の状態を最終状態とする.
  // 0 <= i < nとなるiを決めて、初期状態でA[i]より左にあって、かつ最終状態でA[i]より右にあるものの個数をF[i]とすると、
  // 転倒数は \sum^{n - 1}_{i = 0} F[i] となる.
  // 要は、最初自分より左にあって、最後には自分より右にあるようなものの個数をすべての要素に対して求めたものの合計の個数を転倒数という.
  // 何が言いたいかというと、数列の初期状態と最終状態さえわかってしまえば転倒数は求めることができる.
  // 今回の問題は初期状態が与えられているけど、最終状態がわからないので難しい.
  // 最終状態になれるような数列の並びのパターン数が多すぎるので、最小の転倒数を求めれない.
  // dpを使って求めていく.
  // dp[i][j] := 白をi個、黒をj個並べるときの最小コストとする.
  // 遷移は...
  // dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + costW[j][i]);
  // dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + costB[i][j]);
  // 求める値はdp[n][n]
  // costBは初期状態で黒がj個、白がi個'既に'並べられている、
  // 最終状態で黒がj個、白がi個並べられているすぐ右に黒のj + 1番目を並べる この場合でのF[j + 1].
  // 自分の左にいる黒(n - 1~j + 1)と白(n - 1~i)の合計の数が求まれば、costB[i][j]は求まる. BITを使って求めてね.O(n^2logn)
  // costWも全く同じ方法で求まる.
  // 
  // 最終状態がわかれば、転倒数はもとまる.
  // でも、最終状態がわからないので、dpで次に来るのが白なのか、黒なのかを探索する.
  // 次に来る要素が決まれば、それがその場所に来るまでにどれだけスワップしなければいけないかを求めなくてはいけないので
  // 事前に転倒数の部分解的なやつを求めておく.
  // 今回の問題はこんな感じの流れ.
  cin >> n;
  v.resize(2 * n);
  rep(i, 0, 2 * n) {
    cin >> v[i].fi >> v[i].se;
    v[i].se--;
  }
  rep(i, 0, n + 1) {
    BIT<ll> bit(n);
    ll white = 0;
    rep(j, 0, 2 * n) {
      if (v[j].fi == 'W') {
        if (v[j].se >= i) white++;
        continue;
      }
      costB[i][v[j].se] = bit.sum(v[j].se + 1, n - 1) + white;
      bit.update(v[j].se, 1);
    }
  }
  rep(i, 0, n + 1) {
    BIT<ll> bit(n);
    ll black = 0;
    rep(j, 0, 2 * n) {
      if (v[j].fi == 'B') {
        if (v[j].se >= i) black++;
        continue;
      }
      costW[i][v[j].se] = bit.sum(v[j].se + 1, n - 1) + black;
      bit.update(v[j].se, 1);
    }
  }
  rep(i, 0, 2001) rep(j, 0, 2001) dp[i][j] = LL_INF;
  dp[0][0] = 0;
  rep(i, 0, n + 1) {
    rep(j, 0, n + 1) {
      if (dp[i][j] == LL_INF) continue;
      if (i + 1 <= n) chmin(dp[i + 1][j], dp[i][j] + costW[j][i]);
      if (j + 1 <= n) chmin(dp[i][j + 1], dp[i][j] + costB[i][j]);
    }
  }
  cout << dp[n][n] << endl;
#ifdef  LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << "s." << endl;
#endif
  return 0;
}

Measured memory_bytes: 94976