#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const long long mod = 1e9 + 2022;
const int MAXN = 1e5+5;
int n,m;
int p[MAXN],a[MAXN];
vector<int>g[MAXN];
long long dp[MAXN][2];
long long pd[MAXN];
void dfs(int beg)
{
    if(beg >= n) return;
    for(int nb : g[beg]) dfs(nb);///smetnati
    int sz = g[beg].size();
    for(int i = 0; i <= sz; i++) pd[i] = 0;
    pd[0] = 1;
    /*cout << "in_dfs  " << beg << endl;
    bool f = false;
    if(beg == 1) f = true;
    if(f) cout << "special pechat" << endl;
    for(int i = 0; i <= sz; i++) cout << pd[i] << " ";
    cout << endl;*/
    for(int j = 0; j < sz; j++)
    {
        int nb = g[beg][j];
        for(int i = sz; i >= 0; i--)
        {
            pd[i] = (pd[i]*dp[nb][0])%mod;
            pd[i] += (pd[i-1]*dp[nb][1])%mod;
            pd[i] %= mod;
        }
        /*cout << nb << " " << dp[nb][0] << " " << dp[nb][1] << "->  ";
        for(int i = 0; i <= sz; i++) cout << pd[i] << " ";
        cout << endl;*/
    }
    //for(int i = 0; i <= sz; i++) cout << pd[i] << " ";
    //cout << endl;
    for(int br1 = 0; br1 <= sz; br1++)
    {
        dp[beg][1] += (pd[br1]*(br1))%mod;
        dp[beg][1] %= mod;
        dp[beg][0] += (pd[br1]*(sz-br1))%mod;
        dp[beg][0] %= mod;
    }
}
void dfs_but(int beg)
{
    if(beg < n)
    {
    int sz = g[beg].size();
    for(int i = 0; i <= sz; i++) pd[i] = 0;
    pd[0] = 1;
    /*cout << "in_dfs  " << beg << endl;
    bool f = false;
    if(beg == 1) f = true;
    if(f) cout << "special pechat" << endl;
    for(int i = 0; i <= sz; i++) cout << pd[i] << " ";
    cout << endl;*/
    for(int j = 0; j < sz; j++)
    {
        int nb = g[beg][j];
        for(int i = sz; i >= 0; i--)
        {
            pd[i] = (pd[i]*dp[nb][0])%mod;
            pd[i] += (pd[i-1]*dp[nb][1])%mod;
            pd[i] %= mod;
        }
        /*cout << nb << " " << dp[nb][0] << " " << dp[nb][1] << "->  ";
        for(int i = 0; i <= sz; i++) cout << pd[i] << " ";
        cout << endl;*/
    }
    //for(int i = 0; i <= sz; i++) cout << pd[i] << " ";
    //cout << endl;
    dp[beg][0] = dp[beg][1] = 0;
    for(int br1 = 0; br1 <= sz; br1++)
    {
        dp[beg][1] += (pd[br1]*(br1))%mod;
        dp[beg][1] %= mod;
        dp[beg][0] += (pd[br1]*(sz-br1))%mod;
        dp[beg][0] %= mod;
    }
    }
    if(p[beg] != -1) dfs_but(p[beg]);
}
void solve()
{
    /*cout << endl;
    cout << "START solve" << endl;
    for(int i = n; i < n+m; i++) cout << a[i-n] << " ";
    cout << endl;*/
    for(int i = 0; i < n+m; i++) dp[i][0] = dp[i][1] = 0;
    for(int i = 0; i < m; i++) dp[i+n][a[i]] = 1;
    dfs(0);
    /*for(int i = 0; i < n+m; i++) cout << dp[i][0] << " ";
    cout << endl;
    for(int i = 0; i < n+m; i++) cout << dp[i][1] << " ";
    cout << endl;*/
}
void init(int N, int M, vector<int> P, vector<int> A)
{
    n = N;
    m = M;
    for(int i = 0; i < n+m; i++)
    {
        p[i] = P[i];
        if(i) g[p[i]].push_back(i);
    }
    for(int i = 0; i < m; i++) a[i] = A[i];
    solve();
}
int count_ways(int L, int R)
{
    L -= n;
    R -= n;
    for(int i = L; i <= R; i++)
    {
        a[i] ^= 1;
        swap(dp[i+n][0],dp[i+n][1]);
    }
    int ver = R + n;
    dfs_but(ver);
    return (int)dp[0][1];
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |