#include<iostream>
#include<unordered_map>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
PII p[4]={{0,1},{1,1},{0,0},{1,0}};//初始坐标
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
//数学坐标系进行偏移量计算
unordered_map<string,int> id={{"FL",0},{"FR",1},{"RL",2},{"RR",3}};
/*
1 FL FR
0 RL RR
0 1
*/
unordered_map<char,int> turn={{'F',0},{'B',2},{'L',3},{'R',1}};
/*
0 上
3左 1 右
2 下
顺时针!看图就好 就知道偏移量需要加多少了
*/
void rotate(PII& a,PII& b){
//rotate 轮换(座位)
b.x-=a.x,b.y-=a.y;//让每个点以原点为轴旋转
int x=b.y,y=-b.x;
/*
公式: 旋转后的点的坐标为
设起始点stx,sty,结束点edx,edy
(cosθ ,-sinθ )
矩阵A(stx,sty)*(sinθ , cosθ )=矩阵B(edx,edy)
- θ 为所旋转的角度
*/
b.x=a.x+x,b.y=a.y+y;//恢复半径
}
int main(){
int n;
cin>>n;
int minx=0,miny=0,maxx=1,maxy=1;
int d=0;
while(n--){
string s;
cin>>s;
int k=id[s.substr(0,2)];//选中的腿
char c=s[2];//哪个操作
if(c!='P'){
int t=(d+turn[c])%4;// 当前方向加上偏移方向就是你需要移动的方向
p[k].x+=dx[t];
p[k].y+=dy[t];
}
else{
for(int i=0;i<4;i++)
if(i!=k)
rotate(p[k],p[i]);
d=(d+1)%4;//旋转后的方向 顺时针旋转90°相当于方向偏移量+1
/*
0 上
3左 1 右
2 下
*/
}
//每次操作判断是否会绊腿
for(int i=0;i<4;i++)
for(int j=0;j<i;j++)
if(p[i]==p[j]){
puts("-1");
return 0;
}
//更新矩阵大小
for(int i=0;i<4;i++){
minx=min(minx,p[i].x);
maxx=max(maxx,p[i].x);
miny=min(miny,p[i].y);
maxy=max(maxy,p[i].y);
}
}
cout<<(maxx-minx+1)*(maxy-miny+1)<<endl;
return 0;
}