#include "circuit.h"
#ifdef LOCAL
#include "stub.cpp"
#endif
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define iint signed
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define RREP(i,n) for(int i=(n)-1;i>=0;i--)
#define RREP1(i,n) for(int i=(n);i>=1;i--)
#define f first
#define s second
#define pb push_back
#define ALL(x) (x).begin(),(x).end()
#define SZ(x) ((int)((x).size()))
#define pii pair<int,int>
#define Graph vector<vector<int>>
#define Graphw vector<vector<pii>>
template<typename S> void chmin(S &x,S y) { x=min(x,y); }
template<typename S> void chmax(S &x,S y) { x=max(x,y); }
#define Vi vector<int>
#define Vpii vector<pii>
#ifdef LOCAL
#define op(x) cout<<(#x)<<"="<<(x)<<", ";
#define ope(x) cout<<(#x)<<"="<<(x)<<endl;
#define oparr(x) {cout<<(#x)<<":";for(auto allen:(x)) cout<<allen<<" ";cout<<" size="<<(x).size()<<endl;}
#define entr cout<<endl;
#else
#define op(x) ;
#define ope(x) ;
#define oparr(x) ;
#define entr ;
#endif
template<typename S>
ostream& operator<<(ostream& os,vector<S> p) { for(auto allen:p) os<<allen<<' ';return os<<'\n'; }
template<typename S>
istream& operator>>(istream& os,vector<S> &p) { for(auto &allen:p) os>>allen;return os; }
const int mod=(int)1e9+2022;
struct SEG {
int n;
Vi a,w;
void init(int _n,Vi _a,Vi _w) {
n=_n,a=_a,w=_w;
}
void ud(int l,int r) {
for(int i=l;i<=r;i++) a[i]=1-a[i];
}
int qu(){
int an=0;
REP(i,n) (an+=a[i]*w[i])%=mod;
return an%mod;
}
};
namespace {
int n,m,N;
Graph g;
SEG seg;
};
void init(iint _N, iint _M, std::vector<iint> P, std::vector<iint> A) {
n=_N,m=_M;
N=n+m;
g=Graph(N);
REP1(i,N-1) {
g[P[i]].pb(i);
}
Vi sw(N,1);
auto dfs1=[&](auto dfs1,int u) ->void {
if(u>=n) return;
sw[u]=SZ(g[u]);
for(int v:g[u]) {
dfs1(dfs1,v);
(sw[u]*=sw[v])%=mod;
}
};
dfs1(dfs1,0);
Vi w(m);
auto dfs2=[&](auto dfs2,int u,int now) ->void {
if(u>=n) {
w[u-n]=now;
return;
}
Vi t,d;
t.pb(0),d.pb(1);
for(int v:g[u]) {
t.pb(v);
d.pb(sw[v]);
}
t.pb(0),d.pb(1);
int sz=SZ(g[u]);
Vi pd=d,sd=d;
REP1(i,sz) (pd[i]*=pd[i-1])%=mod;
RREP1(i,sz) (sd[i]*=sd[i+1])%=mod;
REP1(i,sz) dfs2(dfs2,t[i],(now*pd[i-1]%mod*sd[i+1]%mod));
};
dfs2(dfs2,0,1);
oparr(w)
Vi a(m);
REP(i,m) a[i]=A[i];
seg.init(m,a,w);
ope(seg.qu())
}
iint count_ways(iint L, iint R) {
int l=L-n,r=R-n;
seg.ud(l,r);
return seg.qu();
}