void main(){
  import std.stdio, std.string, std.conv, std.algorithm;

  int n; rd(n);
  auto color=new char[](n*2), a=new int[](n*2);  
  auto pos_w=new int[](n*2), pos_b=new int[](n*2);
  fill(pos_w, -1); fill(pos_b, -1);
  foreach(i; 0..(n*2)){
    rd(color[i], a[i]); a[i]--;
    if(color[i]=='W') pos_w[a[i]]=i;
    else pos_b[a[i]]=i;
  }
  
  auto cnt_w=new int[][](n*2, n*2), // [i, n*2)にあるj以下の数の個数（白色の）
       cnt_b=new int[][](n*2, n*2);
  for(int i=n*2-1; i>=0; i--){
    for(int h=0; h<=i; h++){
      if(color[i]=='W') cnt_w[h][a[i]]++;
      else cnt_b[h][a[i]]++;
    }
  }
  foreach(i; 0..(n*2)){
    for(int j=1; j<(n*2); j++){
      cnt_w[i][j]+=cnt_w[i][j-1];
      cnt_b[i][j]+=cnt_b[i][j-1];
    }
  }
  
  auto dp=new int[][](n+1, n+1);
  for(int i=0; i<=n; i++) fill(dp[i], 1_000_000_000);
  dp[0][0]=0;
  for(int i=0; i<=n; i++)for(int j=0; j<=n; j++){ // 白:0, 1, ..., i-1まで置いた；次置くのはi
    if(i<n){
      int cost_w=0;
      if(i-1>=0) cost_w+=cnt_w[pos_w[i]][i-1];
      if(j-1>=0) cost_w+=cnt_b[pos_w[i]][j-1];
      chmin(dp[i+1][j], dp[i][j]+cost_w);
    }
    if(j<n){
      int cost_b=0;
      if(j-1>=0) cost_b+=cnt_b[pos_b[j]][j-1];
      if(i-1>=0) cost_b+=cnt_w[pos_b[j]][i-1];
      chmin(dp[i][j+1], dp[i][j]+cost_b);
    }
  }
  writeln(dp[n][n]);
}

void chmin(T)(ref T l, T r){if(l>r)l=r;}

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x) e=l[i].to!(typeof(e));
}
