#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];
vector<int> ch[MAXN];
ll dp[MAXN],prod[MAXN],num[MAXN][MAXN];
bool pos[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;
            if(!pos[i])continue;
            seen++;
            for(int j=seen;j>0;j--){
                num[node][j]+=num[node][j-1]*dp[i]%MOD; num[node][j]%=MOD;
            }
        }
    }
    for(int i=seen;i>0;i--)suff[node][i]=(num[node][i]+suff[node][i+1])%MOD;
    for(int i=1;i<=am[node];i++){
        if(cnt[node]>=i){
           // if(node==2)cout<<"HEE "<<cnt[node]<<' '<<i<<endl;
            pos[node]=1;
            dp[node]+=prod[node]; dp[node]%=MOD;
            continue;
        }
        int req=i-cnt[node];
        if(req>seen)continue;
        pos[node]=1;
        dp[node]+=suff[node][req]; dp[node]%=MOD;
    }
  //  cout<<node<<' '<<dp[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; pos[i]=0;
        for(int j=0;j<MAXN;j++){
            suff[i][j]=0;
            num[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];
}
| # | 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... |