#include <bits/stdc++.h>
using namespace std;
#define mset(x,val) memset(x,val,sizeof(x))
#define allof(x) x.begin(), x.end()
#define fi first
#define se second
using ll = long long;
using vi = vector<int>;
using vii = vector<vector<int>>;
using vl = vector<long long>;
using vll = vector<vector<long long>>;
using vb = vector<bool>;
using vbb = vector<vector<bool>>;
using mii = map<int,int>;
using umii = unordered_map<int,int>;
using pii = pair<int,int>;
using pll = pair<long long,long long>;
using pli = pair<long long, int>;
using pil = pair<int, long long>;
#define __builtin_popcount __builtin_popcountll
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(x) ((1ll << (x)))
#define debug(a, l, r) for (int _i = (l); _i <= (r); ++_i) cout << (a)[_i] << ' '; cout << '\n';
const int maxn = 1e5 + 5;
int n,q;
const ll MOD1 = 1e9+7;
const ll MOD2 = 1e9+9;
const ll BASE = 100001;
struct Hash
{
ll h1, h2;
bool operator == (const Hash &other) const
{
return (h1 == other.h1 && h2 == other.h2);
}
};
vl pw1, pw2;
vl inv_pw1, inv_pw2;
ll inv(ll x, ll mod)
{
ll res=1, p=mod-2;
while (p)
{
if (p &1) res = res*x%mod;
x = x * x % mod;
p >>=1;
}
return res;
}
void precompute(int n)
{
pw1.resize(n+5);
pw2.resize(n+5);
inv_pw1.resize(n+5);
inv_pw2.resize(n+5);
pw1[0] = pw2[0] = 1;
for (int i=1; i<=n; ++i)
{
pw1[i] = pw1[i-1] * BASE % MOD1;
pw2[i] = pw2[i-1] * BASE % MOD2;
}
inv_pw1[n] = inv(pw1[n], MOD1);
inv_pw2[n] = inv(pw2[n], MOD2);
for (int i=n-1; i>=0; --i)
{
inv_pw1[i] = inv_pw1[i+1] * BASE % MOD1;
inv_pw2[i] = inv_pw2[i+1] * BASE % MOD2;
}
}
vector <Hash> build_hash(string s, int n)
{
vector <Hash> pref (n+5);
pref[0] = {0, 0};
for (int i=1; i<=n; ++i)
{
pref[i].h1 = (pref[i-1].h1 + 1LL * s[i-1] *pw1[i]) % MOD1;
pref[i].h2 = (pref[i-1].h2 + 1LL * s[i-1] * pw2[i]) % MOD2;
}
return pref;
}
Hash get_hash(int l, int r, vector<Hash> &pref)
{
Hash res;
res.h1 = (pref[r].h1 - pref[l-1].h1 ) % MOD1;
res.h2 = (pref[r].h2 - pref[l-1].h2 ) % MOD2;
if (res.h1 < 0) res.h1+=MOD1;
if (res.h2 < 0) res.h2+=MOD2;
res.h1 = 1LL * res.h1 * inv_pw1[l] % MOD1;
res.h2 = 1LL * res.h2 * inv_pw2[l] % MOD2;
return res;
}
struct Eertree
{
struct Node
{
int len;
int link;
int next[26];
ll cnt;
ll s_cnt;
int r;
Node (int _n)
{
len = _n;
link = 0;
cnt = 0;
s_cnt = 0;
mset(next, 0);
}
};
int n;
vector <Node> tree;
string s;
int last;
Eertree(int _n)
{
n = _n;
tree.reserve(n+3);
tree.push_back(Node(-1));
tree.push_back(Node(0));
tree[0].link = 0;
tree[1].link = 0;
last = 1;
s="";
}
int get_link(int v, int pos)
{
while (1)
{
int curlen = tree[v].len;
if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) break;
v = tree[v].link;
}
return v;
}
void add_char(char c)
{
int pos = s.size();
s+=c;
int cur = get_link(last, pos);
int cidx = c-'a';
if (tree[cur].next[cidx])
{
last = tree[cur].next[cidx];
tree[last].cnt++;
tree[last].s_cnt++;
return;
}
int new_node = tree.size();
tree.push_back(Node(tree[cur].len + 2));
tree[new_node].r = pos;
tree[cur].next[cidx] = new_node;
if (tree[new_node].len == 1)
{
tree[new_node].link = 1;
}
else
{
int num = get_link(tree[cur].link, pos);
tree[new_node].link = tree[num].next[cidx];
}
tree[new_node].cnt = 1;
tree[new_node].s_cnt = 1;
last = new_node;
}
void build(string &str)
{
for (char &c : str) add_char(c);
}
void propagate()
{
for (int i=tree.size()-1; i>=2; --i)
{
tree[tree[i].link].s_cnt += tree[i].s_cnt;
}
}
int distinct_palin_cnt()
{
return tree.size() - 2;
}
ll palin_cnt()
{
ll res=0;
for (int i=2; i<tree.size(); ++i) res+=tree[i].s_cnt;
return res;
}
};
string s;
int get_lcp(int l1, int r1, int l2, int r2, vector<Hash> &pref)
{
int low = 1 , high = min(r1 - l1 +1, r2 - l2 + 1), ans = 0;
while(low <=high)
{
int mid = (low + high) >> 1;
if (get_hash(l1, l1 + mid-1, pref) == get_hash(l2, l2+mid-1, pref))
{
ans = mid;
low = mid+1;
}
else high = mid-1;
}
return ans;
}
void Input()
{
cin >> n >> q;
cin>>s;
Eertree et = Eertree (n);
et.build(s);
vector <pair<pii, int>> palins;
et.propagate();
for (int i=2; i<et.tree.size(); ++i)
{
palins.push_back({{et.tree[i].r - et.tree[i].len + 2, et.tree[i].r + 1}, et.tree[i].s_cnt});
}
precompute(n);
auto pref = build_hash(s, n);
sort(allof(palins), [&](auto A, auto B)
{
int l1 = A.fi.fi, r1 = A.fi.se;
int l2 = B.fi.fi, r2 = B.fi.se;
int lcp = get_lcp(l1, r1, l2, r2, pref);
int len1= r1 - l1 + 1;
int len2= r2 - l2 + 1;
if (lcp == min(len1, len2))
{
if (len1 != len2) return len1 < len2;
return l1 < l2;
}
return s[l1 + lcp - 1] < s[l2 + lcp - 1];
});
int m = palins.size();
vl pos(m+1, 0);
for (int i=1; i<=m; ++i)
{
pos[i] = pos[i-1] + palins[i-1].se;
}
// for (int i=0; i<m; ++i)
// {
// cout<<palins[i].fi.fi<< " "<<palins[i].fi.se<<" "<<palins[i].se<<'\n';
// }
// debug(pos, 1, m);
while (q--)
{
ll k;
cin>>k;
if (k > pos[m])
{
cout<<-1<<'\n';
continue;
}
int p = lower_bound(pos.begin()+1, pos.end(), k) - pos.begin();
cout<<get_hash(palins[p-1].fi.fi, palins[p-1].fi.se, pref).h1 <<'\n';
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
Input();
return 0;
}