#include <iostream>
#include <vector>
using namespace std;
#define ll long long
#define MOD (ll)1000002022
vector<int> a;
vector<vector<ll>> adj;
vector<pair<ll, ll>> dp;
int n, m;
void init(int N, int M, vector<int> p, vector<int> A){
adj.assign(N+M, {});
a = A;
n = N;
m = M;
for(int i = 1; i<p.size(); i++){
adj[p[i]].push_back(i);
}
return;
}
int dfs(int st){
if(adj[st].size() == 0){
dp[st] = {a[st-n], 1 - a[st-n]};
return a[st-n];
}
vector<pair<ll, ll>> v;
v.assign(adj[st].size()+1, {0, 0});
v[0].first = 1;
dp[st].second = adj[st].size();
for(auto i : adj[st]){
dfs(i);
dp[st].second = (dp[st].second * (dp[i].first + dp[i].second))%MOD;
vector<pair<ll, ll>> newV(adj[st].size()+1, {-1, -1});
newV[0].first = (v[0].first * dp[i].second)%MOD;
for(int j = 1; j<newV.size(); j++){
newV[j].first = (((v[j].first * dp[i].second)%MOD) + ((v[j-1].first * dp[i].first)%MOD))%MOD;
}
v = newV;
}
dp[st].first = 0;
for(int i = 0; i<v.size(); i++){
dp[st].first = (dp[st].first + ((i * v[i].first)%MOD))%MOD;
}
dp[st].second = (dp[st].second - dp[st].first + MOD)%MOD;
return dp[st].first%MOD;
}
int count_ways(int L, int R){
for(int i = L-n; i<=R-n; i++) a[i] = !a[i];
dp.assign(n+m, {0-1, -1});
return dfs(0);
}