// Original C++ solution (slower):
//pragma

//#pragma GCC optimize("Ofast")

//#pragma GCC optimize("unroll-loops")



#include <bits/stdc++.h>



#define YOU using

#define DONT namespace

#define SAY std



YOU DONT SAY;



typedef long long ll;

typedef unsigned long long ull;

typedef pair<int,int> pii;

typedef pair<ll,ll> pll;

typedef pair<ll,int> pli;

typedef pair<int,ll> pil;

typedef vector<int> vi;

typedef vector<pii> vii;

typedef vector<pll> vll;



#define REPP(i,a,b,d) for(int i=a;i<=b;i+=d)

#define REP(i,a,b) REPP(i,a,b,1)

#define REVV(i,a,b,d) for(int i=a;i>=b;i-=d)

#define REV(i,a,b) REVV(i,a,b,1)



#define FOR(i,a) for(int i=0; i<a; i++)

#define FORD(i,a) for(int i=(int)a-1; i>=0; i--)



#define pb push_back

#define F first

#define S second



const int OO = 1e9;

const ll INF = 1e18;



const int irand(int lo,int hi){

	return ((double)rand()/(RAND_MAX + 1.0)) * (hi-lo+1) + lo;

}



const ll lrand(ll lo,ll hi){

	return ((double)rand()/(RAND_MAX + 1.0)) * (hi-lo+1) + lo;

}



#define getc getchar

template<typename T>

T getnum(){

	int sign = 1;

	T ret = 0;

	char c;



	do{

		c = getc();

	}while(c == ' ' || c == '\n');

	if(c == '-')sign = -1;

	else ret = c-'0';

	while(1){

		c = getc();

		if(c < '0' || c > '9')break;

		ret = 10*ret + c-'0';

	}

	return sign * ret;

}



inline void ini(int& x){

	x = getnum<int>();

}



inline void scani(int& x){

	scanf("%d",&x);

}



//end of macro



const int N = 1e5 + 5;



const int cx[] = {1,0,-1,0};

const int cy[] = {0,1,0,-1};



int n;

int x[N], y[N];

int dir[N];



int dirconv(char c){

    if(c == 'R')return 0;

    else if(c == 'U')return 1;

    else if(c == 'L')return 2;

    else if(c == 'D')return 3;

    return -1;

}



ll cekx(ll t){

    ll mn = INF, mx = -INF;

    REP(i,1,n){

        ll xx = x[i] + t * cx[dir[i]];

        mn = min(mn, xx);

        mx = max(mx, xx);

    }

    return mx - mn;

}



ll ceky(ll t){

    ll mn = INF, mx = -INF;

    REP(i,1,n){

        ll yy = y[i] + t * cy[dir[i]];

        mn = min(mn, yy);

        mx = max(mx, yy);

    }

    return mx - mn;

}



ll ceka(ll t){

    return cekx(t) * ceky(t);

}



ll ternary_x(){

    ll lo = 0, hi = 1e9;

    ll ret = -1, ans = INF;

    while(hi - lo >= 5){

        ll mid1 = (lo + lo + hi)/3;

        ll mid2 = (lo + hi + hi)/3;

        ll v1 = cekx(mid1);

        ll v2 = cekx(mid2);

        if(v1 < v2){

            if(v1 < ans)ans = v1, ret = mid1;

            hi = mid2-1;

        }else{

            if(v2 < ans)ans = v2, ret = mid2;

            lo = mid1+1;

        }

    }

    REP(i,lo,hi){

        ll v = cekx(i);

        if(v < ans)ans = v, ret = i;

    }

    return ret;

}



ll ternary_y(){

    ll lo = 0, hi = 1e9;

    ll ret = -1, ans = INF;

    while(hi - lo >= 5){

        ll mid1 = (lo + lo + hi)/3;

        ll mid2 = (lo + hi + hi)/3;

        ll v1 = ceky(mid1);

        ll v2 = ceky(mid2);

        if(v1 < v2){

            if(v1 < ans)ans = v1, ret = mid1;

            hi = mid2-1;

        }else{

            if(v2 < ans)ans = v2, ret = mid2;

            lo = mid1+1;

        }

    }

    REP(i,lo,hi){

        ll v = ceky(i);

        if(v < ans)ans = v, ret = i;

    }

    return ret;

}



ll ternary(){

    ll lo = 0, hi = 1e9;

    ll ret = -1, ans = INF;

    while(hi - lo >= 5){

        ll mid1 = (lo + lo + hi)/3;

        ll mid2 = (lo + hi + hi)/3;

        ll v1 = ceka(mid1);

        ll v2 = ceka(mid2);

        if(v1 < v2){

            if(v1 < ans)ans = v1, ret = mid1;

            hi = mid2-1;

        }else{

            if(v2 < ans)ans = v2, ret = mid2;

            lo = mid1+1;

        }

    }

    REP(i,lo,hi){

        ll v = ceka(i);

        if(v < ans)ans = v, ret = i;

    }

    return ret;

}



int main(){

    ios_base::sync_with_stdio(0);

    cin.tie(0);

    cout.tie(0);

    #define endl '\n'

    cout.setf(ios::fixed);

    cout.setf(ios::showpoint);

    cout.precision(10);

    

    cin>>n;

    REP(i,1,n){

        char c;

        cin>>x[i]>>y[i]>>c;

        dir[i] = dirconv(c);

        x[i] *= 2;

        y[i] *= 2;

    }

    

    ll px = ternary_x();

    ll py = ternary_y();

    

    ll ans = min(ceka(px), ceka(py));

    ans = min(ans, ceka(ternary()));

    

    cout << ans/4;

    if(ans % 4){

        cout << "." << (ans % 4) * 25;

    }

    cout << endl;

    

    return 0;

}

// Optimized solution to the same problem (faster):
#include<stdio.h>

#include<math.h>

#define N 100000000

#define M 100005

int main()

{

	int n;

	double x[M],y[M];

	char c[M];

	double minS=-1,S1,S2,l=0,r=N;

	double minl1=N,maxr1=-N,maxu1=-N,mind1=N,xx1,yy1,move1=0;

	double minl2=N,maxr2=-N,maxu2=-N,mind2=N,xx2,yy2,move2=N;

    scanf("%d",&n);

    for(int i=0;i<n;i++)scanf("%lf%lf %c",&x[i],&y[i],&c[i]);

    for(int k=0;k<=10000&&(move2-move1>0.00000000001);k++)

	{

		minl1=N,maxr1=-N,maxu1=-N,mind1=N;

		minl2=N,maxr2=-N,maxu2=-N,mind2=N;

        move1=(r/3+2*l/3),move2=(2*r/3+l/3);

        for(int i=0;i<n;i++)

		{

	        xx1=xx2=x[i];

			yy1=yy2=y[i];

			if(c[i]=='U')

			{

				yy1+=move1;

				yy2+=move2;

			}

			if(c[i]=='D')

			{

				yy1-=move1;

				yy2-=move2;

			}

			if(c[i]=='L')

			{

				xx1-=move1;

				xx2-=move2;

			}

			if(c[i]=='R')

			{

				xx1+=move1;

				xx2+=move2;

			}

	        if(xx1<minl1)minl1=xx1;

	        if(xx1>maxr1)maxr1=xx1;

	        if(yy1<mind1)mind1=yy1;

	        if(yy1>maxu1)maxu1=yy1;

	        if(xx2<minl2)minl2=xx2;

	        if(xx2>maxr2)maxr2=xx2;

	        if(yy2<mind2)mind2=yy2;

	        if(yy2>maxu2)maxu2=yy2;

	    }

	    S1=(maxr1-minl1)*(maxu1-mind1);

	    S2=(maxr2-minl2)*(maxu2-mind2);

        if(S1<minS||minS==-1)minS=S1;

        if(S2<minS||minS==-1)minS=S2;

        if(S1>S2)l=move1;

        else r=move2;

    }

    printf("%.10f\n",minS);

}

// Fastest known solution for this problem: