#include<bits/stdc++.h>
using namespace std;
/*#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
/*template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
*/ typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair< ll,ll> pl;
typedef pair< int ,int > pii;
#define LOCAL 0
#define dbg(x) cout << #x << " is " << x << "\n"
#define gll(x) scanf("%d",&x)
#define gll2(x,y) scanf("%d%d",&x,&y)
#define gll3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define gllarr(arr,n) f(i,n) gll(arr[i]);
#define sz(x) ((int)x.size())
#define s(x) sort(x.begin(),x.end())
#define all(v) v.begin(),v.end()
#define rs(v) { s(v) ; r(v) ; }
#define r(v) {reverse(all(v));}
#define pb push_back
#define f(i,n) for(int i=0;i<n;i++)
#define fr(i,n) for(int i=n-1;i>=0;i--)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repr(i,a,b) for(int i=a;i>=b;i--)
const ll mod = ( ll) 1e9 + 7 ;
const ll inf = ( ll) 1e16 ;
const ld eps = 1e-12 ;
const ll N = ( int ) 1e4 + 5 ;
const ll LOGN = 19 ;
const ld PI = 3.14159265358979323846 ;
inline ll mul( ll a, ll b, ll m = mod) { return ( ll) ( a * b) % m; }
inline ll add( ll a, ll b, ll m = mod) { a + = b; if ( a >= m) a - = m; if ( a < 0 ) a + = m; return a; }
inline ll power( ll a, ll b, ll m = mod) { if ( b == 0 ) return 1 ; if ( b == 1 ) return ( a % m) ; ll x = power( a, b / 2 , m) ; x = mul( x, x, m) ; if ( b % 2 ) x = mul( x, a, m) ; return x; }
int CountPS( string str, int n)
{
int dp[ n] [ n] ;
memset ( dp, 0 , sizeof ( dp) ) ;
bool P[ n] [ n] ;
memset ( P, false , sizeof ( P) ) ;
for ( int i= 0 ; i< n; i++ )
P[ i] [ i] = true ;
for ( int i= 0 ; i< n- 1 ; i++ )
{
if ( str[ i] == str[ i+ 1 ] )
{
P[ i] [ i+ 1 ] = true ;
dp[ i] [ i+ 1 ] = 1 ;
}
}
for ( int gap= 2 ; gap< n; gap++ )
{
for ( int i= 0 ; i< n- gap; i++ )
{
int j = gap + i;
if ( str[ i] == str[ j] && P[ i+ 1 ] [ j- 1 ] )
P[ i] [ j] = true ;
if ( P[ i] [ j] == true )
dp[ i] [ j] = dp[ i] [ j- 1 ] + dp[ i+ 1 ] [ j] + 1 - dp[ i+ 1 ] [ j- 1 ] ;
else
dp[ i] [ j] = dp[ i] [ j- 1 ] + dp[ i+ 1 ] [ j] - dp[ i+ 1 ] [ j- 1 ] ;
}
}
return dp[ 0 ] [ n- 1 ] ;
}
struct node{
ll val;
int index;
node( ) { }
inline void merge( node l, node r)
{
if ( l.val > r.val )
{
val = l.val ;
index = l.index ;
}
else if ( l.val == r.val )
{
val = l.val ;
index = min( l.index , r.index ) ;
}
else
{
val = r.val ;
index = r.index ;
}
}
inline void no_use( )
{
val = LONG_LONG_MIN;
index = - 1 ;
}
} ;
int num[ N] ;
node segtree[ 4 * N] ;
void build( int nd, int start, int end)
{
if ( start == end)
{
segtree[ nd] .val = num[ start] ;
segtree[ nd] .index = start;
return ;
}
int mid = ( start + end) >> 1 ;
build( 2 * nd + 1 , start, mid) ;
build( 2 * nd + 2 , mid + 1 , end) ;
segtree[ nd] .merge ( segtree[ 2 * nd + 1 ] , segtree[ 2 * nd + 2 ] ) ;
}
node query( int nd, int start, int end, int qs, int qe)
{
if ( end < qs || start > qe || start > end)
{
node temp;
temp.no_use ( ) ;
return temp;
}
if ( start >= qs && end <= qe) return segtree[ nd] ;
node p,q;
int mid = ( start + end) >> 1 ;
p = query( 2 * nd + 1 , start, mid, qs, qe) ;
q = query( 2 * nd + 2 , mid + 1 , end, qs, qe) ;
node ret;
ret.merge ( p,q) ;
return ret;
}
int main( ) {
ios_base:: sync_with_stdio ( false ) ;
cin .tie ( NULL ) ;
if ( LOCAL) {
freopen ( "C:\\ Users\\ Dishant\\ Desktop\\ Collection-DEV c++\\ input.txt" , "r" , stdin ) ;
freopen ( "C:\\ Users\\ Dishant\\ Desktop\\ Collection-DEV c++\\ output.txt" , "w" , stdout ) ;
}
int t;
cin >> t;
while ( t-- )
{
int n,q;
cin >> n>> q;
string s;
unordered_map< string, int > mp;
f( i,n) {
cin >> s;
mp[ s] = i;
int len = s.length ( ) ;
num[ i] = CountPS( s,len) + len;
}
//f(i,n) cout<<num[i]<<" ";
build( 0 ,0 ,n- 1 ) ;
while ( q-- )
{
string l,r;
cin >> l>> r;
int L, R;
L = mp[ l] , R = mp[ r] ;
if ( L > R) swap( L,R) ;
node ans = query( 0 , 0 , n - 1 , L, R) ;
cout << ans.index + 1 << "\n " ;
}
}
return 0 ;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLyojaW5jbHVkZTxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGU8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7Ci8qdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZTxULCBudWxsX3R5cGUsIGxlc3M8VD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+OwoqL3R5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgcGFpcjxsbCxsbD4gcGw7CnR5cGVkZWYgcGFpcjxpbnQsaW50PiBwaWk7CgojZGVmaW5lIExPQ0FMIDAKI2RlZmluZSBkYmcoeCkgY291dCA8PCAjeCA8PCAiIGlzICIgPDwgeCA8PCAiXG4iCiNkZWZpbmUgZ2xsKHgpIHNjYW5mKCIlZCIsJngpCiNkZWZpbmUgZ2xsMih4LHkpIHNjYW5mKCIlZCVkIiwmeCwmeSkKI2RlZmluZSBnbGwzKHgseSx6KSBzY2FuZigiJWQlZCVkIiwmeCwmeSwmeikKI2RlZmluZSBnbGxhcnIoYXJyLG4pIGYoaSxuKSBnbGwoYXJyW2ldKTsKI2RlZmluZSBzeih4KSAoKGludCl4LnNpemUoKSkKI2RlZmluZSBzKHgpIHNvcnQoeC5iZWdpbigpLHguZW5kKCkpCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgcnModikgeyBzKHYpIDsgcih2KSA7IH0KI2RlZmluZSByKHYpIHtyZXZlcnNlKGFsbCh2KSk7fQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGYoaSxuKSBmb3IoaW50IGk9MDtpPG47aSsrKQojZGVmaW5lIGZyKGksbikgZm9yKGludCBpPW4tMTtpPj0wO2ktLSkKI2RlZmluZSByZXAoaSxhLGIpIGZvcihpbnQgaT1hO2k8PWI7aSsrKQojZGVmaW5lIHJlcHIoaSxhLGIpIGZvcihpbnQgaT1hO2k+PWI7aS0tKQoKY29uc3QgbGwgbW9kID0gKGxsKTFlOSArIDc7CmNvbnN0IGxsIGluZiA9IChsbCkxZTE2Owpjb25zdCBsZCBlcHMgPSAxZS0xMjsKY29uc3QgbGwgTiA9IChpbnQpMWU0ICsgNTsKY29uc3QgbGwgTE9HTiA9IDE5Owpjb25zdCBsZCBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDY7CmlubGluZSBsbCBtdWwobGwgYSwgbGwgYiwgbGwgbSA9IG1vZCkgeyByZXR1cm4gKGxsKShhICogYikgJSBtO30KaW5saW5lIGxsIGFkZChsbCBhLCBsbCBiLCBsbCBtID0gbW9kKSB7IGEgKz0gYjsgaWYoYSA+PSBtKSBhIC09IG07IGlmKGEgPCAwKSBhICs9IG07IHJldHVybiBhO30KaW5saW5lIGxsIHBvd2VyKGxsIGEsIGxsIGIsIGxsIG0gPSBtb2QpIHsgaWYoYiA9PSAwKSByZXR1cm4gMTsgaWYoYiA9PSAxKSByZXR1cm4gKGEgJSBtKTsgbGwgeCA9IHBvd2VyKGEsIGIgLyAyLCBtKTsgeCA9IG11bCh4LCB4LCBtKTsgaWYoYiAlIDIpIHggPSBtdWwoeCwgYSwgbSk7IHJldHVybiB4O30KCgppbnQgQ291bnRQUyhzdHJpbmcgc3RyLCBpbnQgbikKewogICAgaW50IGRwW25dW25dOwogICAgbWVtc2V0KGRwLCAwLCBzaXplb2YoZHApKTsKICAgIGJvb2wgUFtuXVtuXTsKICAgIG1lbXNldChQLCBmYWxzZSAsIHNpemVvZihQKSk7CiAKICAgIGZvciAoaW50IGk9IDA7IGk8IG47IGkrKykKICAgICAgICBQW2ldW2ldID0gdHJ1ZTsKIAogICAgZm9yIChpbnQgaT0wOyBpPG4tMTsgaSsrKQogICAgewogICAgICAgIGlmIChzdHJbaV0gPT0gc3RyW2krMV0pCiAgICAgICAgewogICAgICAgICAgICBQW2ldW2krMV0gPSB0cnVlOwogICAgICAgICAgICBkcFtpXVtpKzFdID0gMSA7CiAgICAgICAgfQogICAgfQogCiAgICBmb3IgKGludCBnYXA9MiA7IGdhcDxuOyBnYXArKykKICAgIHsKICAgICAgICBmb3IgKGludCBpPTA7IGk8bi1nYXA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGludCBqID0gZ2FwICsgaTsKICAgICAgICAgICAgaWYgKHN0cltpXSA9PSBzdHJbal0gJiYgUFtpKzFdW2otMV0gKQogICAgICAgICAgICAgICAgUFtpXVtqXSA9IHRydWU7CiAKICAgICAgICAgICAgaWYgKFBbaV1bal0gPT0gdHJ1ZSkKICAgICAgICAgICAgICAgIGRwW2ldW2pdID0gZHBbaV1bai0xXSArIGRwW2krMV1bal0gKyAxIC0gZHBbaSsxXVtqLTFdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IGRwW2ldW2otMV0gKyBkcFtpKzFdW2pdIC0gZHBbaSsxXVtqLTFdOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBkcFswXVtuLTFdOwp9CgpzdHJ1Y3Qgbm9kZXsKICAgIGxsIHZhbDsKICAgIGludCBpbmRleDsKICAgIG5vZGUoKSB7fQogICAgaW5saW5lIHZvaWQgbWVyZ2Uobm9kZSBsLCBub2RlIHIpCiAgICB7CiAgICAgICAgaWYobC52YWwgPiByLnZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHZhbCA9IGwudmFsOwogICAgICAgICAgICBpbmRleCA9IGwuaW5kZXg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYobC52YWwgPT0gci52YWwpCiAgICAgICAgewogICAgICAgICAgICB2YWwgPSBsLnZhbDsKICAgICAgICAgICAgaW5kZXggPSBtaW4obC5pbmRleCwgci5pbmRleCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhbCA9IHIudmFsOwogICAgICAgICAgICBpbmRleCA9IHIuaW5kZXg7CiAgICAgICAgfQogICAgfQoKICAgIGlubGluZSB2b2lkIG5vX3VzZSgpCiAgICB7CiAgICAgICAgdmFsID0gTE9OR19MT05HX01JTjsKICAgICAgICBpbmRleCA9IC0xOwogICAgfQp9OwoKaW50IG51bVtOXTsKbm9kZSBzZWd0cmVlWzQgKiBOXTsKCnZvaWQgYnVpbGQoaW50IG5kLCBpbnQgc3RhcnQsIGludCBlbmQpCnsKICAgIGlmKHN0YXJ0ID09IGVuZCkKICAgIHsKICAgICAgICBzZWd0cmVlW25kXS52YWwgPSBudW1bc3RhcnRdOwogICAgICAgIHNlZ3RyZWVbbmRdLmluZGV4ID0gc3RhcnQ7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChzdGFydCArIGVuZCkgPj4gMTsKICAgIGJ1aWxkKDIgKiBuZCArIDEsIHN0YXJ0LCBtaWQpOwogICAgYnVpbGQoMiAqIG5kICsgMiwgbWlkICsgMSwgZW5kKTsKICAgIHNlZ3RyZWVbbmRdLm1lcmdlKHNlZ3RyZWVbMiAqIG5kICsgMV0sIHNlZ3RyZWVbMiAqIG5kICsgMl0pOwp9Cgpub2RlIHF1ZXJ5KGludCBuZCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgcXMsIGludCBxZSkKewogICAgaWYoZW5kIDwgcXMgfHwgc3RhcnQgPiBxZSB8fCBzdGFydCA+IGVuZCkKICAgIHsKICAgICAgICBub2RlIHRlbXA7CiAgICAgICAgdGVtcC5ub191c2UoKTsKICAgICAgICByZXR1cm4gdGVtcDsKICAgIH0KICAgIGlmKHN0YXJ0ID49IHFzICYmIGVuZCA8PSBxZSkgcmV0dXJuIHNlZ3RyZWVbbmRdOwogICAgbm9kZSBwLHE7CiAgICBpbnQgbWlkID0gKHN0YXJ0ICsgZW5kKSA+PiAxOwogICAgcCA9IHF1ZXJ5KDIgKiBuZCArIDEsIHN0YXJ0LCBtaWQsIHFzLCBxZSk7CiAgICBxID0gcXVlcnkoMiAqIG5kICsgMiwgbWlkICsgMSwgZW5kLCBxcywgcWUpOwogICAgbm9kZSByZXQ7CiAgICByZXQubWVyZ2UocCxxKTsKICAgIHJldHVybiByZXQ7Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgaWYgKExPQ0FMKSB7CiAgICAgICAgZnJlb3BlbigiQzpcXFVzZXJzXFxEaXNoYW50XFxEZXNrdG9wXFxDb2xsZWN0aW9uLURFViBjKytcXGlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIkM6XFxVc2Vyc1xcRGlzaGFudFxcRGVza3RvcFxcQ29sbGVjdGlvbi1ERVYgYysrXFxvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwogICAgfQogICAgaW50IHQ7CiAgICBjaW4+PnQ7CiAgICB3aGlsZSh0LS0pCiAgICB7CiAgICAgICAgaW50IG4scTsKICAgICAgICBjaW4+Pm4+PnE7CiAgICAgICAgc3RyaW5nIHM7CiAgICAgICAgdW5vcmRlcmVkX21hcDxzdHJpbmcsIGludD4gbXA7CiAgICAgICAgZihpLG4pIHsKICAgICAgICAgICAgY2luID4+IHM7CiAgICAgICAgICAgIG1wW3NdID0gaTsKICAgICAgICAgICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CiAgICAgICAgICAgIG51bVtpXSA9IENvdW50UFMocyxsZW4pICsgbGVuOwogICAgICAgIH0KICAgICAgICAvL2YoaSxuKSBjb3V0PDxudW1baV08PCIgIjsKICAgICAgICBidWlsZCgwLDAsbi0xKTsKICAgICAgICB3aGlsZShxLS0pCiAgICAgICAgewogICAgICAgICAgICBzdHJpbmcgbCxyOwogICAgICAgICAgICBjaW4+Pmw+PnI7CiAgICAgICAgICAgIGludCBMLCBSOwogICAgICAgICAgICBMID0gbXBbbF0sIFIgPSBtcFtyXTsKICAgICAgICAgICAgaWYoTCA+IFIpIHN3YXAoTCxSKTsKICAgICAgICAgICAgbm9kZSBhbnMgPSBxdWVyeSgwLCAwLCBuIC0gMSwgTCwgUik7CiAgICAgICAgICAgIGNvdXQ8PGFucy5pbmRleCArIDE8PCJcbiI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=