import java.util.*;
import java.io.*;
class Ants {
//private static final boolean DEBUG = true;
static int a1pos, a2pos;
static double time, actTime;
while ( line != null ) {
p = line.split( " " );
ArrayList<Ant> ants = new ArrayList<Ant>();
for ( int i = 0; i < a; ++i ) {
p = br.readLine().split( " " );
ants.
add( new Ant
( Integer.
parseInt(p
[0]), p
[1].
charAt(0) ) ); }
//if (DEBUG) System.out.println( "solving" );
solve( l, ants );
if ( a2pos
!= -1 ) System.
out.
println( String.
format("The last ant will fail down in %.0f seconds - started at %d and %d.", time, a1pos, a2pos
)); else System.
out.
println( String.
format( "The last ant will fail down in %.0f seconds - started at %d.", time, a1pos
) ); line = br.readLine();
}
}
// simulation
private static void solve( int l, ArrayList<Ant> ants) {
actTime = 0;
//if (DEBUG) System.out.println( "DEBUG: ants - " + ants );
a1pos = -1;
a2pos = -1;
time = -1;
int n = ants.size();
while ( n > 0 ) {
ArrayList<Ant> nants = new ArrayList<Ant>();
//if (DEBUG) System.out.println( "DEBUG: left" );
// remove those walking left
for ( int i = 0; i < n; ++i ) {
Ant ant = ants.get(i);
if ( ant.dir == 'L' ) {
double tmp = ant.pos;
if ( tmp + actTime == time ) {
a2pos = ant.start;
}
if ( tmp + actTime > time ) {
time = tmp + actTime;
a1pos = ant.start;
}
} else {
nants.add( ant ); // copy to new list
for ( int j = i+1; j < n; ++j ) { nants.add( ants.get(j)); }
break;
}
}
ants = nants;
n = ants.size();
nants = new ArrayList<Ant>();
//if (DEBUG) System.out.println( "DEBUG: ants - " + ants );
//if (DEBUG) System.out.println( "DEBUG: right" );
// remove those walking right
for ( int i = n-1; i >= 0; --i ) {
Ant ant = ants.get(i);
if ( ant.dir == 'R' ) {
double tmp = l - ant.pos;
if ( tmp + actTime == time ) {
a2pos = ant.start;
}
if ( tmp + actTime> time ) {
time = tmp + actTime;
a1pos = ant.start;
}
} else {
nants.add( ant ); // copy to new list
for ( int j = i-1; j >= 0; --j ) { nants.add( ants.get(j)); }
break;
}
}
ants = nants;
n = ants.size();
nants = new ArrayList<Ant>();
//if (DEBUG) System.out.println( "DEBUG: ants - " + ants );
// find smallest space
//if (DEBUG) System.out.println( "DEBUG: move" );
HashSet<Integer> si = new HashSet<Integer>(); // smallest firts ant index
double ss = -1D; // smallest space
for ( int i = 0; i < n - 1; ++i ) {
Ant f = ants.get( i );
Ant s = ants.get( i+1 );
if ( f.dir == 'R' && f.dir != s.dir ) {
double tmp = s.pos - f.pos;
if ( ss == -1 || ss > tmp ) {
si.clear();
si.add( i );
ss = tmp;
}
if ( ss == tmp ) {
si.add( i );
}
}
}
move( ants, ss / 2, si );
//if (DEBUG) System.out.println( "DEBUG: ants - " + ants );
}
}
private static void move( ArrayList<Ant> ants, double d, HashSet<Integer> set ) {
//if (DEBUG) System.out.println( "DEBUG: d=" + d + ", set=" + set.toString() );
actTime += d;
int n = ants.size();
for ( int i = 0; i < n; ++i ) {
Ant act = ants.get(i);
if ( act.dir == 'L' ) {
act.pos -= d;
if (set.contains(i) || set.contains(i-1) ) {
act.dir = 'R';
}
} else {
act.pos += d;
if (set.contains(i) || set.contains(i-1) ) {
act.dir = 'L';
}
}
}
}
private static class Ant implements Comparable<Ant> {
double pos; // position
char dir; // direction
int start;
Ant( int p, char d ) { start = p; pos = p; dir = d; }
public int compareTo( Ant a ) {
if ( a.pos == this.pos ) {
if ( this.dir == 'L' ) return -1;
else return 1;
}
return this.pos < a.pos ? -1 : 1;
}
/*public String toString() {
boolean d = DEBUG;
return String.format( "[pos=%f, dir=%c, start=%d]", pos, dir, start );
}*/
}
}