/*
* 模拟题:挺有意思的。
* 看似有些麻烦,因为貌似是动态的对各蚂蚁的方向要调整,
* 其实没必要的,两只蚂蚁碰撞,按题意是需要改变方向的,但其实可以看成直接互穿,
* 也就是两只蚂蚁直接穿过对方,继续前进,这样想只是为了方便计算所有蚂蚁最后的位置。
* 但注意!! 并不是原来的蚂蚁! 也就是说,编号变了! 比如A 和 B 在点O碰撞,
* 之后又各自行进了3cm,最后在O - 3 和 O + 3都有只蚂蚁,但是,实际上,O - 3是A,而一开始看成穿越式的话,A便不再O - 3上了
* 也就是说,在你计算完所有蚂蚁所在的位置之后,还要计算各蚂蚁对应的位置,因为题目要求按照蚂蚁的输入顺序,输出最后位置。
* 这样就可以先在输入的时候对各蚂蚁进行编号NO1 2 3...
* 这里还有一点就是,无论怎么碰撞,若对一开始输入的蚂蚁的位置进行排序,最终的位置是不变的,
* 也就是说,因为实际上碰撞后发生了转向而不是穿越,所以顺序是不变的。 比如一开始位置顺序(不是编号顺序)是A B C D四只蚂蚁,那么最后计算出来的位置也就是按照这样的顺序的蚂蚁分布。
* 所以,步骤: (1) 对所有蚂蚁按照位置pos排序;
(2) 计算出最后所在位置;
(3) 在根据位置顺序一一对应;
(4) 再根据 编号NO进行排序;
(5) 最后输出。
*/
#include <cstdio>
#include <algorithm>
using namespace std;
struct Ant {
int pos, NO;
char dir;
} ants[10000], finalAnts[10000];
int cmp1(const Ant &a, const Ant &b)
{
return a.pos < b.pos;
}
int cmp2(const Ant &a, const Ant &b)
{
return a.NO < b.NO;
}
int main()
{
int cases, L, T, n;
scanf("%d", &cases);
for(int curCase = 1; curCase <= cases; curCase ++) {
int i;
scanf("%d%d%d", &L, &T, &n);
for(i = 0; i < n; i ++) {
scanf("%d %c", &ants[i].pos, &ants[i].dir);
ants[i].NO = i + 1;
}
for(i = 0; i < n; i ++) {
finalAnts[i].dir = ants[i].dir;
if(ants[i].dir == 'R')
finalAnts[i].pos = ants[i].pos + T;
else
finalAnts[i].pos = ants[i].pos - T;
}
sort(ants, ants + n, cmp1);
sort(finalAnts, finalAnts + n, cmp1);
for(i = 0; i < n; i ++) {
ants[i].pos = finalAnts[i].pos;
ants[i].dir = finalAnts[i].dir;
if(ants[i].pos == ants[i - 1].pos) {
ants[i].dir = 'T';
ants[i - 1].dir = 'T';
}
}
sort(ants, ants + n, cmp2);
printf("Case #%d:\n", curCase);
for(i = 0; i < n; i ++) {
if(ants[i].pos < 0 || ants[i].pos > L)
printf("Fell off\n");
else if(ants[i].dir == 'T')
printf("%d Turning\n", ants[i].pos);
else if(ants[i].dir == 'R')
printf("%d R\n", ants[i].pos);
else
printf("%d L\n", ants[i].pos);
}
printf("\n");
}
return 0;
}