#include<stdio.h>
#include<map>
#define maxn 21
#define maxk 7
using namespace std;
FILE*f=fopen("nkperm.in","r");
FILE*g=fopen("nkperm.out","w");
const long long stop = (1LL<<55);
int n,k,tests,elem,base;
int P[maxn*maxk],pbase[maxk],ap[maxn];
long long r;
map< pair<int,int> , long long >S;
inline int get_digit ( int x , const int &c ){
for ( int i = 0 ; i < c ; ++i ){
x /= base;
}
return x % base;
}
inline void set_digit ( int &x , const int &c , const int &value ){
int before = get_digit(x,c);
x -= pbase[c]*before;
x += pbase[c]*value;
}
inline void initializari () {
elem = n*k; base = n+1;
pbase[0] = 1;
for ( int i = 1 ; i <= k ; ++i ){
pbase[i] = pbase[i-1]*base;
}
int basic_conf = 0;
set_digit(basic_conf,k,n);
S[make_pair(basic_conf,k)] = 1;
}
inline long long dinamica ( int conf , int last ){
long long *r = &S[make_pair(conf,last)];
if ( (*r) ) return (*r);
long long s = 0;
for ( int i = 0 ; i < k ; ++i ){
int cate = get_digit(conf,i);
if ( cate == 0 ) continue ;
int new_conf = conf;
set_digit(new_conf,i,cate-1);
set_digit(new_conf,i+1,get_digit(conf,i+1)+1);
s += dinamica(new_conf,i+1)*(cate - (i==last));
if ( s > stop ){
s = stop;
break ;
}
}
(*r) = s;
return s;
}
inline void solveA () {
long long r = 0;
for ( int i = 1 ; i <= n ; ++i ){
ap[i] = 0;
}
for ( int i = 1 ; i <= elem ; ++i ){
fscanf(f,"%d\n",&P[i]);
}
P[0] = -1;
int conf = 0;
set_digit(conf,0,n);
for ( int i = 1 ; i <= elem ; ++i ){
for ( int j = 1 ; j < P[i] ; ++j ){
if ( ap[j] == k || j == P[i-1] ) continue ;
int new_conf = conf;
set_digit(new_conf,ap[j],get_digit(conf,ap[j])-1);
set_digit(new_conf,ap[j]+1,get_digit(conf,ap[j]+1)+1);
r += dinamica(new_conf,ap[j]+1);
}
set_digit(conf,ap[P[i]],get_digit(conf,ap[P[i]])-1);
set_digit(conf,ap[P[i]]+1,get_digit(conf,ap[P[i]]+1)+1);
++ap[P[i]];
}
++r;
fprintf(g,"%lld\n",r);
}
inline void solveB () {
long long ind;
fscanf(f,"%lld\n",&ind);
for ( int i = 1 ; i <= n ; ++i ){
ap[i] = 0;
}
int conf = 0;
set_digit(conf,0,n);
int last = -1;
for ( int i = 1 ; i <= elem ; ++i ){
int pun = 0;
for ( int j = 1 ; j <= n ; ++j ){
if ( j == last || ap[j] == k ) continue ;
int new_conf = conf;
set_digit(new_conf,ap[j],get_digit(conf,ap[j])-1);
set_digit(new_conf,ap[j]+1,get_digit(conf,ap[j]+1)+1);
long long now = dinamica(new_conf,ap[j]+1);
if ( now < ind ){
ind -= now;
}
else{
pun = j;
break ;
}
}
fprintf(g,"%d ",pun);
set_digit(conf,ap[pun],get_digit(conf,ap[pun])-1);
set_digit(conf,ap[pun]+1,get_digit(conf,ap[pun]+1)+1);
++ap[pun];
last = pun;
}
fprintf(g,"\n");
}
int main () {
fscanf(f,"%d %d %d\n",&n,&k,&tests);
initializari();
while ( tests-- ){
char tip;
fscanf(f,"%c",&tip);
if ( tip == 'A' ){
solveA();
}
else{
solveB();
}
}
fclose(f);
fclose(g);
return 0;
}