#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int m = 1000002022, N, M;
vector<ll> pref, suf, subt;
vector<vector<int>> g;
vector<bool> lazy;
vector<pair<ll, ll>> st;
void pushdown(int node){
if (!lazy[node]) return;
st[node*2].first = (st[node*2].second-st[node*2].first+2*m) % m;
st[node*2+1].first = (st[node*2+1].second-st[node*2+1].first+2*m) % m;
lazy[node*2] = !lazy[node*2];
lazy[node*2+1] = !lazy[node*2+1];
lazy[node] = false;
}
void update(int l, int r, int node=1, int tl=0, int tr=M-1){
//cout << l << " " << r << " " << node << " " << tl << " " << tr << endl;
if (tl != tr) pushdown(node);
if (l <= tl && tr <= r){
lazy[node] = true;
st[node].first = (st[node].second-st[node].first+2*m) % m;
return;
}
int tm = (tl+tr)/2;
if (l <= tm) update(l, r, node*2, tl, tm);
if (tm+1 <= r) update(l, r, node*2+1, tm+1, tr);
st[node].first = (st[node*2].first+st[node*2+1].first) % m;
}
void build(vector<ll>& tot, int node=1, int tl=0, int tr=M-1){
if (tl == tr){
st[node] = {0, tot[tl]};
return;
}
int tm = (tl+tr)/2;
build(tot, node*2, tl, tm);
build(tot, node*2+1, tm+1, tr);
st[node] = {0, (st[node*2].second+st[node*2+1].second) % m};
}
void dfs(int cur, ll ct, vector<ll>& tot){
if (cur >= N){
tot[cur-N] = ct;
return;
}
int s = g[cur].size();
for (int i=0; i<s; i++){
if (i == 0) pref[g[cur][i]] = subt[g[cur][i]];
else pref[g[cur][i]] = (pref[g[cur][i-1]]*subt[g[cur][i]]) % m;
}
for (int i=s-1; i>=0; i--){
if (i == s-1) suf[g[cur][i]] = subt[g[cur][i]];
else suf[g[cur][i]] = (suf[g[cur][i+1]]*subt[g[cur][i]]) % m;
}
for (int i=0; i<s; i++){
ll nt = ct;
if (i != 0) nt = (nt*pref[g[cur][i-1]]) % m;
if (i != s-1) nt = (nt*suf[g[cur][i+1]]) % m;
dfs(g[cur][i], nt, tot);
}
}
void init(int N, int M, vector<int> P, vector<int> A){
::N = N;
::M = M;
vector<ll> deg(N, 0);
for (int i=1; i<N+M; i++) deg[P[i]]++;
vector<ll> tot(M, 1);
subt.resize(N+M, 1);
for (int i=N-1; i>=0; i--){
subt[i] = (subt[i]*deg[i]) % m;
if (i != 0) subt[P[i]] = (subt[P[i]]*subt[i]) % m;
}
pref.resize(N+M, 1);
suf.resize(N+M, 1);
g.resize(N+M);
for (int i=N+M-1; i>0; i--) g[P[i]].push_back(i);
dfs(0, 1, tot);
st.resize(4*M);
lazy.resize(4*M, false);
build(tot);
for (int i=0; i<M; i++){
if (A[i]) update(i, i);
}
}
int count_ways(int L, int R){
update(L-N, R-N);
return st[1].first;
}
# | 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... |