#include"circuit.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
const long long mod=1e9+2022;
vector<int> ds[MAXN];
pair<long long,long long> seg[MAXN*4],F[MAXN];
int lazy[MAXN*4],child[MAXN],L[MAXN],R[MAXN],tdfs=0,N,M;
long long pref[MAXN],suff[MAXN];
void dfs(int i)
{
int sz=ds[i].size();
if(!sz) L[i]=R[i]=++tdfs,child[tdfs]=i;
else
{
L[i]=1e9,R[i]=0;
for(auto v:ds[i])
{
dfs(v);
L[i]=min(L[i],L[v]),R[i]=max(R[i],R[v]);
suff[L[v]-1]=suff[L[v]-1]*sz%mod;
pref[R[v]+1]=pref[R[v]+1]*sz%mod;
}
}
}
pair<long long,long long> operator+(const pair<long long,long long>& a,const pair<long long,long long>& b)
{
return {(a.first+b.first)%mod,(a.second+b.second)%mod};
}
void down(int pos)
{
int val=lazy[pos];
if(val)
{
swap(seg[pos*2].first,seg[pos*2].second);
swap(seg[pos*2+1].first,seg[pos*2+1].second);
lazy[pos*2]^=1,lazy[pos*2+1]^=1,lazy[pos]=0;
}
}
void build(int l,int r,int pos)
{
if(l==r)
{
seg[pos]=F[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,pos*2);
build(mid+1,r,pos*2+1);
seg[pos]=seg[pos*2]+seg[pos*2+1];
}
void update(int l,int r,int u,int v,int pos)
{
if(v<l||r<u) return ;
if(u<=l&&r<=v)
{
swap(seg[pos].first,seg[pos].second);
lazy[pos]^=1;
return ;
}
int mid=(l+r)/2;
down(pos);
update(l,mid,u,v,pos*2);
update(mid+1,r,u,v,pos*2+1);
seg[pos]=seg[pos*2]+seg[pos*2+1];
}
void init(int n,int m,vector<int> P,vector<int> A)
{
N=n,M=m;
for(int i=1;i<n+m;i++) ds[P[i]].push_back(i);
for(int i=0;i<=m+1;i++) pref[i]=suff[i]=1;
dfs(0);
for(int i=1;i<=tdfs;i++) pref[i]=pref[i]*pref[i-1]%mod;
for(int i=tdfs;i;i--) suff[i]=suff[i]*suff[i+1]%mod;
for(int i=0;i<m;i++) if(A[i]==0) F[child[i+1]-n]={0,pref[i+1]*suff[i+1]%mod};
else F[child[i+1]-n]={pref[i+1]*suff[i+1]%mod,0};
build(0,m-1,1);
}
int count_ways(int L,int R)
{
update(0,M-1,L-N,R-N,1);
return seg[1].first;
}