Listing: RETEA.PAS
{$M 16384,0,655360} 
 type SG = record 
 l,d:Integer; 
 lc,dc:Char; s:Byte 
 end; 
 const max = 4010; 
 var a:array[0..max] of SG; 
 ntest,n,testfor:Integer; 
 b:array[0..max,1..2] of Byte; 
 
 procedure tata(sw:Integer; loc:Char; 
 var ttata:Integer; var leg:Char); 
 begin 
 if a[sw].S=0 
 then if loc='R' then leg:='L' else    leg:='D' 
 else if loc='R' then leg:='D' 
 else leg:='L'; 
 if leg='L' then ttata:=a[sw].L 
 else ttata:=a[sw].D; 
 if ttata=-1 then Exit; 
 if leg='L' then leg:=a[sw].lc 
 else leg:=a[sw].dc 
 end; 
 
 procedure doit(sw:Integer; loc:Char); 
 var t:Integer; w:Char; 
 begin 
 repeat 
 tata(sw,loc,t,w); 
 if t<>-1 then begin loc:=w; sw:=t    end; 
 until t=-1; 
 if a[sw].S=0 
 then if loc='R' then loc:='L' 
 else loc:='D' 
 else if loc='R' then loc:='D' 
 else loc:='L'; 
 if loc='L' then Write(b[sw,1],' ') 
 else Write(b[sw,2],' ') 
 end; 
 
 procedure init; 
 var i,nconex,sw1,sw2,ns1,nteste:Integer; 
 c1,c2:Char; 
 begin 
 for i:=0 to max do 
 begin 
 a[i].L:=-1; a[i].D:=-1; a[i].s:=0 
 end; 
 Fillchar(b,Sizeof(b),0); 
 Readln(n,nconex); 
 for i:=1 to nconex do 
 begin 
 Read(sw1); 
 repeat Read(c1) until c1<>' '; 
 Read(sw2); 
 repeat Read(c2) until c2<>' '; 
 if c2='L' 
 
then
 begin 
a[sw2].L:=sw1; 
 a[sw2].Lc:=c1 
 end 
 
else
 begin 
a[sw2].D:=sw1; 
 a[sw2].Dc:=c1 
 end; 
 Readln; 
 end; 
 for i:=0 to n-1 do Read(a[i].S);    
 Readln; 
 Readln(ns1); 
 for i:=1 to ns1 do 
 begin 
 Read(sw1); 
 repeat Read(c1) until c1<>' '; 
 if c1='L' 
 then b[sw1,1]:=1 
 else b[sw1,2]:=1; 
 Readln 
 end; 
 Readln(nteste); 
 for i:=1 to nteste do 
 begin 
 Read(sw1); 
 repeat Read(c1) until c1<>' '; 
 doit(sw1,c1); 
 Readln 
 end; 
 Writeln; Readln 
 end; 
 
 Begin 
 Assign(input,'F.DAT'); Reset(input); 
 Readln(ntest); 
 for testfor:=1 to ntest do init;    
 Close(input) 
 End.