#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ret=0,f=1;
char c=getchar();
for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=-f;
for(;c>='0'&&c<='9';c=getchar()) ret=ret*10+c-'0';
return ret*f;
}
int N;
const int maxn=1e3+55;
int fa[maxn],ans[maxn];
struct cow{
int x,y,num;
}a[maxn],b[maxn];
int cnt1,cnt2;
bool flag[maxn];
int _find(int x){
if(fa[x]==x) return x;
else return fa[x]=_find(fa[x]);
}
bool cmp1(cow &a,cow &b){
if(a.y==b.y) return a.x<b.x;
return a.y<b.y;
}
bool cmp2(cow &a,cow &b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void _union(int _x,int _y){
int x=_find(_x),y=_find(_y);
if(x!=y){
fa[x]=y;
ans[y]+=ans[x]+1;
}
}
signed main(void){
N=read();
for(int i=1;i<=N;i++){
int _x,_y;
char ch;
cin>>ch;
_x=read();_y=read();
if(ch=='E') a[++cnt1].x=_x,a[cnt1].y=_y,a[cnt1].num=i;
else b[++cnt2].x=_x,b[cnt2].y=_y,b[cnt2].num=i;
fa[i]=i;
}
sort(a+1,a+1+cnt1,cmp1);
sort(b+1,b+1+cnt2,cmp2);
for(int i=1;i<=cnt1;i++){
for(int j=1;j<=cnt2;j++){
if(flag[j] || a[i].x>b[i].x || a[i].y<b[i].y || a[i].x+a[i].y==b[i].x+b[i].y) continue;
if(b[j].x-a[i].x > a[i].y-b[j].y){
_union(a[i].num,b[j].num);
break;
} else {
_union(b[j].num,a[i].num);
flag[j]=1;
}
}
}
for(int i=1;i<=N;i++){
printf("%d\n",ans[i]);
}
return 0;
}