#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

using ll = long long;
using ld = long double;

const int MAXN = 1e6+50;
const int MOD = 998244353;
const int INF = 1e9;
const ll LLINF = 1e16;
const ld EPS = 1e-9;
const int LOGN = 25;

ll binpow(ll x, ll k) {
    if (k == 0) return 1;
    if (k % 2 == 0) {
        ll d = binpow(x, k/2) % MOD;
        return d*d%MOD;
    }
    return x*(binpow(x, k-1))%MOD;
}

int n, k;
vector<int> g[MAXN];
vector<int> x;

int d[MAXN];
void dfs(int v, int p = 0) {
    d[v] = d[p]+1;
    for (auto u : g[v]) {
        if (u != p) dfs(u, v);
    }
}

ll dp(int t, bool was, int h) { // этаж ; брал ли предыдущий этаж ; самый высокий доступный этаж.
    ll ret = 1;
    if (t == n && h == 1) return 1;

    for (int i = t+1; i <= n; i++) {
        ret += dp(i, was, h);
    }
    return ret;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> k; x.resize(k+1);
    for (int i = 1; i <= k; i++) cin >> x[i];
    for (int i = 2; i <= n; i++) {
        int p; cin >> p;
        // g[i].push_back(p);
        g[p].push_back(i);
    }

    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        ans = (ans + binpow(2, n-x[i])) % MOD;
    }

    cout << ans;
}
