#pragma GCC optimize("Ofast")
#define _USE_MATH_DEFINES
#include "bits/stdc++.h"

using namespace std;

using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;
using i8 = int8_t;
using i16 = int16_t;
using i32 = int32_t;
using i64 = int64_t;

constexpr char newl = '\n';
constexpr double eps = 1e-10;

#define FOR(i,a,b) for (int i = (a); i < (b); i++)
#define F0R(i,b) FOR(i,0,b)
#define RFO(i,a,b) for (int i = ((b)-1); i >=(a); i--)
#define RF0(i,b) RFO(i,0,b)
#define fi first
#define se second
#define debug(x) cout << #x << ": " << x << '\n';
#define rng(a) a.begin(),a.end()
#define rrng(a) a.rbegin(),a.rend()

template<typename T1, typename T2> inline void chmin(T1& a, T2 b) { if (a > b) a = b; }
template<typename T1, typename T2> inline void chmax(T1& a, T2 b) { if (a < b) a = b; }
template<class T> void Print(vector<T> v) {
  F0R(i, v.size()) {
    cout << v[i] << ' ';
  }
  cout << newl;
}

#if 1


// INSERT ABOVE HERE
signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cout << std::fixed << std::setprecision(15);

  // 10^5の点のうち大事なのは一部

  // y軸方向に移動する点のxmin、xmax、
  // x軸方向に移動する点のymin、ymax、
  // minimum bounding box はこれ以下にはならない。

  // 次に、移動方向が同じ点は、移動方向一番奥にある点と手前にある点、2つだけが大事。
  // たとえばLならxが一番小さい点と大きい点のみ見れば良い。
  // 帯が移動していくイメージ。

  // boxと、4つの移動する帯。

  // 計算を整数で行いたいので、座標は全て2倍して扱う。
  // 解を出力するときに1/4にする。

  int N;
  cin >> N;

  int inf = 1e9;
  int xmin = inf, xmax = -inf, ymin = inf, ymax = -inf;

  int umin = inf, umax = -inf, dmin = inf, dmax = -inf;
  int lmin = inf, lmax = -inf, rmin = inf, rmax = -inf;

  F0R(i, N) {
    int x, y;
    char d;
    cin >> x >> y >> d;
    x *= 2; y *= 2;
    if (d == 'U' || d == 'D') {
      chmin(xmin, x);
      chmax(xmax, x);
      if (d == 'U') {
        chmin(umin, y);
        chmax(umax, y);
      }
      else {
        chmin(dmin, y);
        chmax(dmax, y);
      }
    }
    else {
      chmin(ymin, y);
      chmax(ymax, y);
      if (d == 'L') {
        chmin(lmin, x);
        chmax(lmax, x);
      }
      else {
        chmin(rmin, x);
        chmax(rmax, x);
      }
    }
  }

  // n秒後のxmin,xmax,ymin,ymaxを求める
  auto xminLater = [&](int sec) {
    auto r = xmin;
    if (lmin <= lmax) chmin(r, lmin - sec);
    if (rmin <= rmax) chmin(r, rmin + sec);
    return r;
  };
  auto xmaxLater = [&](int sec) {
    auto r = xmax;
    if (lmin <= lmax) chmax(r, lmax - sec);
    if (rmin <= rmax) chmax(r, rmax + sec);
    return r;
  };
  auto yminLater = [&](int sec) {
    auto r = ymin;
    if (umin <= umax) chmin(r, umin + sec);
    if (dmin <= dmax) chmin(r, dmin - sec);
    return r;
  };
  auto ymaxLater = [&](int sec) {
    auto r = ymax;
    if (umin <= umax) chmax(r, umax + sec);
    if (dmin <= dmax) chmax(r, dmax - sec);
    return r;
  };

  // 変化量が変化するタイミングを求める
  auto when = [&](auto lf, int start = 0) {
    auto c = lf(start + 1) - lf(start);
    int l = 0, r = inf;
    while (r - l > 1) {
      auto mp = (l + r) / 2;
      if (lf(mp + 1) - lf(mp) != c) {
        r = mp;
      }
      else {
        l = mp;
      }
    }
    return r;
  };

  set<int> ss;
  ss.insert(0);
  int a;
  ss.insert(a = when(xminLater));
  ss.insert(when(xminLater, a));
  ss.insert(a = when(xmaxLater));
  ss.insert(when(xmaxLater, a));
  ss.insert(a = when(yminLater));
  ss.insert(when(yminLater, a));
  ss.insert(a = when(ymaxLater));
  ss.insert(when(ymaxLater, a));

  // n秒後のBoundingBoxの面積を求める
  auto eval = [&](int sec)->i64 {
    return ((i64)xmaxLater(sec) - xminLater(sec)) *
      ((i64)ymaxLater(sec) - yminLater(sec));
  };

  i64 result = INT64_MAX;
  for (auto s : ss) {
    chmin(result, eval(s));
  }

  /*
  F0R(i, 30) {
    cout << "eval( " << i << " ) = " << eval(i) << newl;
  }
  //*/

  // exact 1/4
  auto e = result;
  cout << (e / 4);
  switch (e % 4) {
  case 1:
    cout << ".25";
    break;
  case 2:
    cout << ".5";
    break;
  case 3:
    cout << ".75";
    break;
  }
}
#endif


Measured memory_bytes: 3648