Problem:
Score : 600 points

Problem Statement

There are N points in a two-dimensional plane. The initial coordinates of the i-th point are (x_i, y_i). Now, each point starts moving at a speed of 1 per second, in a direction parallel to the x- or y- axis. You are given a character d_i that represents the specific direction in which the i-th point moves, as follows:

If d_i = R, the i-th point moves in the positive x direction;

If d_i = L, the i-th point moves in the negative x direction;

If d_i = U, the i-th point moves in the positive y direction;

If d_i = D, the i-th point moves in the negative y direction.

You can stop all the points at some moment of your choice after they start moving (including the moment they start moving).
Then, let x_{max} and x_{min} be the maximum and minimum among the x-coordinates of the N points, respectively. Similarly, let y_{max} and y_{min} be the maximum and minimum among the y-coordinates of the N points, respectively.

Find the minimum possible value of (x_{max} - x_{min}) \times (y_{max} - y_{min}) and print it.

Constraints

1 \leq N \leq 10^5

-10^8 \leq x_i,\ y_i \leq 10^8

x_i and y_i are integers.

d_i is R, L, U, or D.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1 d_1
x_2 y_2 d_2
.
.
.
x_N y_N d_N

Output

Print the minimum possible value of (x_{max} - x_{min}) \times (y_{max} - y_{min}).

The output will be considered correct when its absolute or relative error from the judge's output is at most 10^{-9}.

Sample Input 1

2
0 3 D
3 0 L

Sample Output 1

0

After three seconds, the two points will meet at the origin. The value in question will be 0 at that moment.

Sample Input 2

5
-7 -10 U
7 -6 U
-8 7 D
-3 3 D
0 -6 R

Sample Output 2

97.5

The answer may not be an integer.

Sample Input 3

20
6 -10 R
-4 -9 U
9 6 D
-3 -2 R
0 7 D
4 5 D
10 -10 U
-1 -8 U
10 -6 D
8 -5 U
6 4 D
0 3 D
7 9 R
9 -4 R
3 10 D
1 9 U
1 -6 U
9 -8 R
6 7 D
7 -3 D

Sample Output 3

273

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)


#include <bits/stdc++.h>

using namespace std;

/* g++ -g -fsanitize=address -lasan -std=c++11 -Dfoo_ */

/* freopen("input.txt", "rt", stdin); */
/* freopen("output.txt", "wt", stdout); */

#define ALL(c)          (c).begin(), (c).end()
#define ALLR(c)         (c).rbegin(), (c).rend()
#define FOR(i,a,b)      for (int i=(a); i < (b); ++i)
#define FORR(i,a,b)     for (int i=(a); i > (b); --i)
#define FOR_ALL(i,c)    for (__typeof((c).begin()) i=(c).begin();   \
                             i != (c).end(); ++i)
#define FOR_ALLR(i,c)   for (__typeof((c).rbegin()) i=(c).rbegin(); \
                             i != (c).rend(); ++i)
#define SZ(array)       (sizeof(array)/sizeof(array[0]))
#define lc(x)           (x<<1)     /* 2*x */
#define rc(x)           (x<<1 | 1) /* 2*x+1 */
#define lowbit(x)       (x & (-x)) /* 0b10100 -> 0b100 */

typedef long long       LL;
typedef map<int,int>    MII;
typedef pair<int,int>   PII;
typedef set<int>        SI;
typedef vector<bool>    VB;
typedef vector<double>  VD;
typedef vector<int>     VI;
typedef vector<string>  VS;

/* check if a key is in container C */
template <class C>
inline bool in_(const typename C::key_type& k, const C& A)
{ return A.find(k) != A.end(); }
inline bool in_(const string& s, const string& S)
{ return S.find(s) != string::npos; }

const int inf = 1e9;
const int maxx = 1e8;
const int maxy = 1e8;
int fx[2],fy[2]; vector<int> L,R,U,D;

double calc(const double t)
{
    vector<double> X,Y;
    FOR(i,0,2) if (-maxx <= fx[i] && fx[i] <= maxx)
        X.push_back(fx[i]);
    FOR(i,0,2) if (-maxy <= fy[i] && fy[i] <= maxy)
        Y.push_back(fy[i]);
    if (L.size())
        X.push_back(L[0]-t), X.push_back(L.back()-t);
    if (R.size())
        X.push_back(R[0]+t), X.push_back(R.back()+t);
    if (U.size())
        Y.push_back(U[0]+t), Y.push_back(U.back()+t);
    if (D.size())
        Y.push_back(D[0]-t), Y.push_back(D.back()-t);
    sort(ALL(X)); sort(ALL(Y));
    return (X.empty()|Y.empty()) ? 0 : (X.back()-X[0])*(Y.back()-Y[0]);
}

int main()
{
#ifdef foo_
    freopen("foo", "rt", stdin);
#endif
    ios::sync_with_stdio(false);
    int n;
    while (cin >> n) {
        L.clear(); R.clear(); U.clear(); D.clear();
        fx[0] = fy[0] = inf; fx[1] = fy[1] = -inf;
        FOR(i,0,n) {
            int x,y; char d; cin >> x >> y >> d;
            if (d == 'L')
                L.push_back(x), fy[0]=min(fy[0],y), fy[1]=max(fy[1],y);
            if (d == 'R')
                R.push_back(x), fy[0]=min(fy[0],y), fy[1]=max(fy[1],y);
            if (d == 'U')
                U.push_back(y), fx[0]=min(fx[0],x), fx[1]=max(fx[1],x);
            if (d == 'D')
                D.push_back(y), fx[0]=min(fx[0],x), fx[1]=max(fx[1],x);
        }
        sort(ALL(L)); sort(ALL(R)); sort(ALL(U)); sort(ALL(D));
        double lft = 0, rht = inf;
        FOR(_,0,500) {
            const double m1 = lft + (rht-lft)/3.0;
            const double m2 = rht - (rht-lft)/3.0;
            const double v1 = calc(m1);
            const double v2 = calc(m2);
            if (v1 <= v2)
                rht = m2;
            else
                lft = m1;
        }
        printf("%.10f\n",calc(lft));
    }
    return 0;
}