#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5+5, MOD = 1e9+2022;
int N, M;
ll S[MAXN], C[MAXN];
vector <int> adj[MAXN];
struct segment {
int L, R;
ll val, mx;
bool flip;
segment *lef, *rig;
segment(int x,int y) {
L = x; R = y;
val = 0; flip = 0;
if (L == R) {
mx = C[L];
return;
}
int mid = (L+R)/2;
lef = new segment(L,mid);
rig = new segment(mid+1,R);
mx = lef->mx + rig->mx;
}
void update(int x,int y) {
if (x > R || y < L) {
return;
}
if (x <= L && y >= R) {
val = mx - val;
flip ^= 1;
return;
}
if (flip) {
flip = 0;
lef->val = lef->mx - lef->val;
rig->val = rig->mx - rig->val;
lef->flip ^= 1;
rig->flip ^= 1;
}
lef->update(x,y);
rig->update(x,y);
val = lef->val + rig->val;
}
} tree(0,0);
void calc(int cur,ll val) {
if (cur >= N) {
C[cur] = val;
return;
}
vector <ll> suf(adj[cur].size(),1);
for (int i=adj[cur].size()-1;i>0;i--) {
suf[i-1] = S[adj[cur][i]]*suf[i]%MOD;
}
ll pre = val;
for (int i=0;i<(int)adj[cur].size();i++) {
calc(adj[cur][i],pre*suf[i]%MOD);
pre = pre*S[adj[cur][i]]%MOD;
}
}
ll dfs(int cur) {
if (cur >= N) return S[cur] = 1;
S[cur] = adj[cur].size();
for (int next : adj[cur]) {
S[cur] = S[cur]*dfs(next)%MOD;
}
return S[cur];
}
void init(int n,int m,vector<int> P,vector<int> A) {
N = n;
M = m;
for (int i=1;i<N+M;i++) {
adj[P[i]].push_back(i);
}
dfs(0);
calc(0,1);
tree = segment(N,N+M-1);
for (int i=0;i<M;i++) {
if (A[i]) {
tree.update(i+N,i+N);
}
}
}
int count_ways(int L,int R) {
tree.update(L,R);
return tree.val % MOD;
}
# | 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... |