#include <bits/stdc++.h>
#include "circuit.h"
using namespace std;
#define pb push_back
#define ll long long
const ll MAXN=2000+5,MOD=1000002022;
ll n,m,cnt[MAXN],am[MAXN],suff[MAXN][MAXN],pref[MAXN][MAXN];
vector<int> ch[MAXN];
ll dp[MAXN][2],prod[MAXN],num[MAXN][MAXN];
//dp[i] ammount of ways to make i black. prod[i] how many ways to assign parameters in i subtree
//num[i] how many ways such i of its threshold children are black
void dfs(int node){
    prod[node]=1;
    int seen=0;
    num[node][0]=1;
    for(auto i:ch[node]){
        if(i<n){
            dfs(i);
            prod[node]*=prod[i]*am[i]%MOD;
            prod[node]%=MOD;
            seen++;
            for(int j=seen;j>=0;j--){
                num[node][j]=num[node][j]*dp[i][0]%MOD;
                if(j>0) {
                    num[node][j] += num[node][j - 1] * dp[i][1] % MOD;
                    num[node][j] %= MOD;
                }
            }
        }
    }
   // if(node==0)cout<<num[node][1]<<' '<<num[node][2]<<endl;
    for(int i=seen;i>0;i--)suff[node][i]=(num[node][i]+suff[node][i+1])%MOD;
    pref[node][0]=num[node][0];
    for(int i=1;i<=seen;i++)pref[node][i]=(num[node][i]+pref[node][i-1])%MOD;
    for(int i=1;i<=am[node];i++){
        if(cnt[node]>=i){
            dp[node][1]+=prod[node]; dp[node][1]%=MOD;
            continue;
        }
        int req=i-cnt[node];
        if(req<=seen){
            dp[node][1]+=suff[node][req]; dp[node][1]%=MOD;
            dp[node][0]+=pref[node][req-1]; dp[node][0]%=MOD;
        }
        else{
            dp[node][0]+=prod[node]; dp[node][0]%=MOD;
        }
    }
  //  cout<<node<<' '<<dp[node][0]<<' '<<cnt[node]<<endl;
}
vector<int> a,p;
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
    for(int i=0;i<MAXN;i++){
        cnt[i]=0; am[i]=0; ch[i].clear(); dp[i][0]=0; dp[i][1]=0;
        for(int j=0;j<MAXN;j++){
            suff[i][j]=0;
            num[i][j]=0;
            pref[i][j]=0;
        }
    }
    p=P;
    a=A;
    n=N; m=M;
    for(int i=1;i<P.size();i++){
        ch[P[i]].pb(i);
        if(i>=n && A[i-N])cnt[P[i]]++;
        am[P[i]]++;
    }
  //  cout<<"bruv"<<cnt[2]<<endl;
}
int count_ways(int L, int R) {
    for(int i=L-n;i<=R-n;i++)a[i]^=1;
    init(n,m,p,a);
    dfs(0);
    return dp[0][1];
}
/*
 * 3 4 1
-1 0 0 1 1 2 2
0 0 0 1
6 6
 */
| # | 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... |