static void Main() { Sc sc = new Sc(); int n = sc.I; Bit bit = new Bit(n * 2); int[] b = new int[n + 1], w = new int[n + 1]; string[] a = new string[n * 2]; int[] r = new int[n * 2]; for (int i = 0; i < n * 2; i++) { a[i] = sc.S; r[i] = int.Parse((a[i].Split())[1]); if (a[i][0] == 'B') { b[r[i]] = i; } else { w[r[i]] = i; } } long[,,] dp = new long[n + 1, n + 1, 2]; for (int i = 0; i <= n; i++) { bit = new Bit(n * 2); if (i != 0) { for (int j = 1; j < i; j++) { bit.Ud(b[j] + 1, 1); } dp[i, 0, 0] = dp[i - 1, 0, 0] + b[i] - bit.Get(b[i] + 1); bit.Ud(b[i] + 1, 1); } for (int j = 1; j <= n; j++) { dp[i, j, 0] = dp[i, j - 1, 0] + w[j] - bit.Get(w[j] + 1); if (i != 0) { dp[i, j, 0] = Math.Min(dp[i, j, 0], dp[i - 1, j, 0] + b[i] - dp[i - 1, j, 1]); } if (j != 0) { bit.Ud(w[j] + 1, 1); } if (i != n) { dp[i, j, 1] = bit.Get(b[i + 1] + 1); } } bit.Clear(); } Console.WriteLine("{0}", dp[n, n, 0]); }