#include <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

int N;
long long int x[100005], y[100005];
string d[100005];

set<long double> A;
vector<long double > V;

long double max_X(long double t) {

	long double ret = -9.9e99;

	for (int i = 1; i <= N; i++) {
		long double tmp;
		if (d[i] == "R") { tmp = 1.0L*x[i] + 1.0L*t; }
		else if (d[i] == "L") { tmp = 1.0L*x[i] - 1.0L*t; }
		else { tmp = 1.0L*x[i]; }
		ret = max(ret, tmp);
	}
	return ret;
}

long double min_X(long double t) {

	long double ret = +9.9e99;

	for (int i = 1; i <= N; i++) {
		long double tmp;
		if (d[i] == "R") { tmp = 1.0L*x[i] + 1.0L*t; }
		else if (d[i] == "L") { tmp = 1.0L*x[i] - 1.0L*t; }
		else { tmp = 1.0L*x[i]; }
		ret = min(ret, tmp);
	}
	return ret;
}

long double max_Y(long double t) {

	long double ret = -9.9e99;

	for (int i = 1; i <= N; i++) {
		long double tmp;
		if (d[i] == "U") { tmp = 1.0L*y[i] + 1.0L*t; }
		else if (d[i] == "D") { tmp = 1.0L*y[i] - 1.0L*t; }
		else { tmp = 1.0L*y[i]; }
		ret = max(ret, tmp);
	}
	return ret;
}

long double min_Y(long double t) {

	long double ret = +9.9e99;

	for (int i = 1; i <= N; i++) {
		long double tmp;
		if (d[i] == "U") { tmp = 1.0L*y[i] + 1.0L*t; }
		else if (d[i] == "D") { tmp = 1.0L*y[i] - 1.0L*t; }
		else { tmp = 1.0L*y[i]; }
		ret = min(ret, tmp);
	}
	return ret;
}

void CHECK(int j, int k) {


	long double tm=-1.0L;
	if (d[j] == "R") {
		if (d[k] == "L") { tm = (1.0*x[k] - 1.0*x[j]) / 2.0L;}
		else if (d[k] == "U" || d[k] == "D") { tm = 1.0L*x[k] - 1.0L*x[j]; }
	}
	else if (d[j] == "L") {
		if (d[k] == "R") { tm = (1.0L*x[j] - 1.0L*x[k]) / 2.0L; }
		else if (d[k] == "U" || d[k] == "D") { tm = 1.0L*x[j] - 1.0L*x[k]; }
	}
	else if (d[j] == "U") {
		if (d[k] == "D") { tm = (1.0L*y[k] - 1.0L*y[j]) / 2.0L; }
		else if (d[k] == "L" || d[k] == "R") { tm = 1.0L*y[k] - 1.0L*y[j]; }
	}
	else {
		if (d[k] == "U") { tm = (1.0L*y[j] - 1.0L*y[k])/2.0L; }
		else if (d[k] == "L" || d[k] == "R") { tm = 1.0L*y[j] - 1.0L*y[k]; }
	}

	

	if (tm > 0.0L) { A.insert(tm); }

}

long double X_fixed_max, X_fixed_min;
long double Y_fixed_max, Y_fixed_min;
long double epsilon=1.0e-6;

long double Q(long double t1, long double t2) {

	long double a, b;

	a = max_X(t1) - min_X(t1);
	b = max_X(t2) - min_X(t2);

	long double c, d;
	c = max_Y(t1) - min_Y(t1);
	d = max_Y(t2) - min_Y(t2);

	if (t1 == t2) { return a*c; }

	long double ret = min(a*c,b*d);


	long double alpha = (b - a) / (t2 - t1);
	long double beta = a - alpha*t1;

	long double gamma = (d - c) / (t2 - t1);
	long double delta = c - gamma*t1;

	if (alpha == 0.0L || gamma == 0.0L) { return ret; }

	long double tp = -(alpha*delta + beta*gamma) / 2.0L / alpha / gamma;

	if (t1 < tp && tp < t2) {
		ret = min(ret, (max_X(tp) - min_X(tp))*(max_Y(tp) - min_Y(tp)));
	}

	//cout << "ret= " << ret << endl;
	return ret;

}

int main(void) {

	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> x[i] >> y[i] >> d[i];
	}

	/*
	X_fixed_max = -9.9e99;
	X_fixed_min = 9.9e99;
	Y_fixed_max = -9.9e99;
	Y_fixed_min = 9.9e99;

	for (int i = 1; i <= N; i++) {
		if (d[i] == "U" || d[i] == "D") {
			X_fixed_max = max(X_fixed_max, 1.0L*x[i]);
			X_fixed_min = min(X_fixed_min, 1.0L*x[i]);
		}
		else {
			Y_fixed_max = max(Y_fixed_max, 1.0L*y[i]);
			Y_fixed_min = min(Y_fixed_min, 1.0L*y[i]);
		}
	}
	*/

	

	int ID[5][5]; int p = 1;
	long double val[5][5];
	long double INF = 9.9e99;

	string S[5]; S[1] = "R"; S[2] = "L"; S[3] = "U"; S[4]="D";

	for (int i = 1; i <= 4; i++) {
		for (int j = 1; j <= 4; j++) {
			ID[i][j] = 1;
			if (j == 1 || j==3) { val[i][j] = -INF; }
			else { val[i][j] = INF; }
		}
	}

	

	for (int i = 1; i <= N; i++) {
		for (int k = 1; k <= 4; k++) {
			if (d[i] != S[k]) { continue; }
			for (int j = 1; j <= 4; j++) {
				if (j == 1) { if (val[k][j] < 1.0L*x[i]) { val[k][j] = 1.0L*x[i]; ID[k][j] = i; } }
				else if (j == 2) { if (val[k][j] > 1.0L*x[i]) { val[k][j] = 1.0L*x[i]; ID[k][j] = i; } }
				else if (j == 3) { if (val[k][j] <1.0L* y[i]) { val[k][j] = 1.0L*y[i]; ID[k][j] = i; } }
				else if (j == 4) { if (val[k][j] > 1.0L*y[i]) { val[k][j] = 1.0L*y[i]; ID[k][j] = i; } }
			}
		}
	}

	/*for (int i = 1; i <= 4; i++) {
		for (int j = 1; j <= 4; j++) {
			cout << "ID[" << i << "][" << j << "]= " << ID[i][j] << endl;
		}
	}*/
	
	
	for (int i = 1; i <= 4; i++) {
		for (int j = 1; j <= 4; j++) {
			for (int k = 1; k <= 4; k++) {
				for (int m = 1; m <= 4; m++) {
					CHECK(ID[i][j], ID[k][m]);
					CHECK(ID[k][m], ID[i][j]);
				}
			}
		}
	}
	
	V.push_back(0.0);
	for (auto a : A) {
		V.push_back(a);
	}

		long double ans = (max_X(0.0)-min_X(0.0))*(max_Y(0.0)-min_Y(0.0));
		//cout << "ans= " << ans << endl;

		/*for (int i = 0; i < (int)V.size(); i++) {
			cout << V[i]<<"  X = " << max_X(V[i]) - min_X(V[i]) << "  Y= " << max_Y(V[i]) - min_Y(V[i]) << endl;
		}*/

		for (int i = 0; i < (int)V.size() - 1; i++) {
			if (V[i] == V[i + 1]) { continue; }

			ans = min(ans, Q(V[i], V[i + 1]));
			//cout << "ans= " << ans << endl;
		}

		cout << setprecision(15)<<fixed<< ans << endl;

		return 0;
}

Measured memory_bytes: 7296