#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
// === CẤU HÌNH HASHING ===
const long long MOD = 1e9+9277;
const int BASE = 1e9+1;
const int MAXN = 2005; // Tăng nhẹ giới hạn N phòng trường hợp
long long POW[MAXN];
long long h[MAXN]; // Hash xuôi
long long rh[MAXN]; // Hash ngược (để lấy hash của đoạn đảo ngược nhanh)
int n;
// Hàm lấy Hash xuôi của đoạn [l, r]
long long getHash(long long hashArr[], int l, int r) {
if (l > r) return 0;
long long res = (hashArr[r] - hashArr[l - 1] * POW[r - l + 1]) % MOD;
if (res < 0) res += MOD;
return res;
}
// Hàm tính Hash của dãy con [Start, End]
// Trong đó đoạn con [l, r] (nằm trong Start, End) bị đảo ngược
long long getHashWithReverseSub(int Start, int End, int l, int r) {
// Đoạn [Start ... End] chia làm 3 phần:
// P1: [Start ... l-1] (giữ nguyên)
// P2: [l ... r] (đảo ngược)
// P3: [r+1 ... End] (giữ nguyên)
// 1. Hash P1
long long p1 = getHash(h, Start, l - 1);
// 2. Hash P2 (Lấy từ mảng rh)
// Mapping: l -> n - r + 1, r -> n - l + 1
int rl = n - r + 1;
int rr = n - l + 1;
long long p2 = getHash(rh, rl, rr);
// 3. Hash P3
long long p3 = getHash(h, r + 1, End);
// Ghép Hash: P1 * B^(len2 + len3) + P2 * B^len3 + P3
int len2 = r - l + 1;
int len3 = End - r;
long long res = p1;
res = (res * POW[len2 + len3]) % MOD; // Dịch P1
long long p2_shifted = (p2 * POW[len3]) % MOD; // Dịch P2
res = (res + p2_shifted) % MOD;
res = (res + p3) % MOD; // Cộng P3
return res;
}
// Hàm đếm số dãy khác nhau tạo được từ đoạn [L, R]
long long countDistinctArrays(int L, int R) {
if (L > R) return 1; // Đoạn rỗng coi như có 1 trường hợp
vector<long long> distinctHashes;
// 1. Thêm trường hợp gốc (không đảo gì cả)
distinctHashes.push_back(getHash(h, L, R));
// 2. Thử đảo mọi đoạn con [i, j] nằm trong [L, R]
// Chỉ đảo đoạn có độ dài >= 2 vì đảo độ dài 1 không thay đổi gì
for (int i = L; i <= R; i++) {
for (int j = i + 1; j <= R; j++) {
long long val = getHashWithReverseSub(L, R, i, j);
distinctHashes.push_back(val);
}
}
// 3. Đếm số phần tử khác nhau
sort(distinctHashes.begin(), distinctHashes.end());
return unique(distinctHashes.begin(), distinctHashes.end()) - distinctHashes.begin();
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
freopen("tet.inp", "r", stdin);
freopen("tet.out", "w", stdout);
int q;
if (!(cin >> n >> q)) return 0;
vector<int> a(n + 1);
vector<int> ra(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
// Tạo mảng đảo ngược để hỗ trợ tính toán
for (int i = 1; i <= n; i++) ra[i] = a[n - i + 1];
// --- PRECOMPUTE HASH ---
POW[0] = 1;
for (int i = 1; i <= n; i++) POW[i] = (POW[i - 1] * BASE) % MOD;
h[0] = 0;
for (int i = 1; i <= n; i++) h[i] = (h[i - 1] * BASE + a[i]) % MOD;
rh[0] = 0;
for (int i = 1; i <= n; i++) rh[i] = (rh[i - 1] * BASE + ra[i]) % MOD;
// -----------------------
while (q--) {
int P;
cin >> P;
// Tính số lượng dãy khác nhau bên trái (1 ... P-1)
long long leftCount = countDistinctArrays(1, P - 1);
// Tính số lượng dãy khác nhau bên phải (P+1 ... N)
long long rightCount = countDistinctArrays(P + 1, n);
// Yêu cầu: Lấy MAX của 2 bên
cout << max(leftCount, rightCount) << "\n";
}
return 0;
}