// #define _GLIBCXX_DEBUG
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define all(x) x.begin(), x.end()

// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2")

const int MOD = 998244353;
const int MAXN = 1e6 + 1;

int bin_pow(int x, int y) {
    if (!y) return 1;
    if (y % 2) return x * bin_pow(x, y - 1) % MOD;
    int res = bin_pow(x, y / 2);
    return res * res % MOD;
}

int fact[MAXN];
int rev_fact[MAXN];
int comb(int n, int k) {
    if (k > n) return 0;
    return fact[n] * rev_fact[k] % MOD * rev_fact[n - k] % MOD;
}

vector<vector<int>> graph;
vector<vector<int>> dp;
vector<bool> is_special;
vector<int> sz;

void dfs_sz(int v, int p) {
    sz[v] = 1;
    for (auto u : graph[v]) {
        if (u != p) {
            dfs_sz(u, v);
            sz[v] += sz[u];
        }
    }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    fact[0] = 1;
    for (int i = 1; i < MAXN; i++) {
        fact[i] = fact[i - 1] * i % MOD;
    }
    rev_fact[MAXN - 1] = bin_pow(fact[MAXN - 1], MOD - 2);
    for (int i = MAXN - 2; i >= 0; i--) {
        rev_fact[i] = rev_fact[i + 1] * (i + 1) % MOD;
    }

    int n, k;
    cin >> n >> k;
    vector<int> x(k);
    is_special.resize(n, false);
    for (int i = 0; i < k; i++) {
        cin >> x[i];
        x[i]--;
        is_special[x[i]] = true;
    }
    graph.resize(n);
    vector<int> p(n - 1);
    for (int i = 0; i < n - 1; i++) {
        cin >> p[i];
        p[i]--;
        graph[p[i]].push_back(i + 1);
        graph[i + 1].push_back(p[i]);
    }
    sz.resize(n, 0);
    dfs_sz(0, 0);
    int ans = bin_pow(2, sz[x[0]]);
//    cout << sz[x[0]] << " sz ";
    for (auto u : graph[x[0]]) {
//        cout << " u = " << u << endl;
        if (u > x[0]) {
            ans -= bin_pow(2, sz[u]) - 1;
            ans %= MOD;
//            cout << sz[u] << " ";
        }
    }
//    cout << endl;
    ans--;
    cout << ans << endl;
    return 0;
}
