This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000002022;
vector<vector<int>> child;
vector<long long> dp1, dp2;
int n,m;
vector<int> a;
void calc(int node = 0) {
    // cout << node << endl;
    if (child[node].size() == 0) {
        dp1[node] = a[node-n];
        dp2[node] = 1-a[node-n];
        return;
    }
    vector<long long> dp3(child[node].size()+1, 0);
    dp3[0]=1;
    for (int &x:child[node]){
        calc(x);
        for (int i=(int)dp3.size()-1;i>0;i--) {
            dp3[i] = (dp3[i] + dp1[x] * dp3[i-1]) % MOD;
            dp3[i-1] = (dp3[i-1] * dp2[x]) % MOD;
        }
        // for (auto &x:dp3) {
        //     cout<<x<<" ";
        // }
        // cout<<endl;
    }
    // cout << "node " << node << "\n";
    // cout << "end " << node << endl;
    dp1[node] = dp2[node] = 0;
    for (int i=0;i<(int)dp3.size();i++) {
        dp1[node] = (dp1[node] + dp3[i] * i) % MOD;
        dp2[node] = (dp2[node] + dp3[i] * ((int)dp3.size() - i - 1)) % MOD;
    }
    // cout << dp1[node] << " " << dp2[node] << endl;
    // cout << endl;
}
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
    n = N;m=M;
    a = A;
    child.resize(n+m);
    for (int i=1;i<N+M;i++) {
        child[P[i]].push_back(i);
    }
    dp1.resize(n+m);
    dp2.resize(n+m);
}
int count_ways(int L, int R) {
    // cout << "first print a" << endl;
    for (int i=L-n;i<=R-n;i++) {
        a[i] = 1-a[i];
    }
    // for (int i=0;i<m;i++) {
    //     cout<<a[i]<<" ";
    // }
    // cout<<"\n";
    calc();
    return dp1[0];
}
| # | 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... |