#include "circuit.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int n, m, onoff[101010], par[202020];
vector<int> adj[202020];
const long long MOD = 1000002022;
long long cnt[202020], wgt[202020], sum[101010];
void get_cnt(int v) {
if (v < n) cnt[v] = adj[v].size();
else cnt[v] = 1;
for (int i = 0; i < adj[v].size(); i++) {
int next = adj[v][i];
get_cnt(next);
cnt[v] = (cnt[v] * cnt[next]) % MOD;
}
}
long long get_wgt(int v, int goal) {
if (v == goal) return 1;
for (int i = 0; i < adj[v].size(); i++) {
int next = adj[v][i];
long long ret = get_wgt(next, goal);
if (ret > 0) {
for (int j = 0; j < adj[v].size(); j++) {
if (i != j) ret = (ret * cnt[adj[v][j]]) % MOD;
}
return ret;
}
}
return 0;
}
struct seg {
long long tree[404040], lazy[404040];
vector<long long> arr;
void init(int v, int st, int ed) {
if (st == ed) {
tree[v] = arr[st];
lazy[v] = 0;
return;
}
int mid = (st + ed) / 2;
init(2 * v, st, mid);
init(2 * v + 1, mid + 1, ed);
tree[v] = tree[2 * v] + tree[2 * v + 1];
}
void update(int v, int st, int ed, int gs, int ge) {
if (lazy[v] % 2 == 1) {
tree[v] = sum[ed] - sum[st - 1] - tree[v];
if (st != ed) {
lazy[2 * v] += lazy[v];
lazy[2 * v + 1] += lazy[v];
}
lazy[v] = 0;
}
if (gs > ed || ge < st) return;
if (gs <= st && ed <= ge) {
tree[v] = sum[ed] - sum[st - 1] - tree[v];
if (st != ed) {
lazy[2 * v] += 1;
lazy[2 * v + 1] += 1;
}
return;
}
int mid = (st + ed) / 2;
update(2 * v, st, mid, gs, ge);
update(2 * v + 1, mid + 1, ed, gs, ge);
tree[v] = tree[2 * v] + tree[2 * v + 1];
}
long long get(int v, int st, int ed, int gs, int ge) {
if (lazy[v] % 2 == 1) {
tree[v] = sum[ed] - sum[st - 1] - tree[v];
if (st != ed) {
lazy[2 * v] += lazy[v];
lazy[2 * v + 1] += lazy[v];
}
lazy[v] = 0;
}
if (gs > ed || ge < st) return 0;
if (gs <= st && ed <= ge) return tree[v];
int mid = (st + ed) / 2;
return get(2 * v, st, mid, gs, ge) + get(2 * v + 1, mid + 1, ed, gs, ge);
}
} sumtree;
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
n = N;
m = M;
for (int i = 0; i < n + m; i++) par[i] = P[i];
for (int i = 0; i < m; i++) onoff[i] = A[i];
for (int i = 1; i < n + m; i++) {
adj[par[i]].push_back(i);
}
get_cnt(0);
for (int i = n; i < n + m; i++) wgt[i] = get_wgt(0, i);
for (int i = n; i < n + m; i++) sum[i] = (sum[i - 1] + wgt[i]) % MOD;
for (int i = 0; i < n; i++) sumtree.arr.push_back(0);
for (int i = n; i < n + m; i++) sumtree.arr.push_back(onoff[i - n] * wgt[i]);
sumtree.init(1, n, n + m - 1);
}
int count_ways(int L, int R) {
sumtree.update(1, n, n + m - 1, L, R);
return (sumtree.get(1, n, n + m - 1, n, n + m - 1)) % MOD;
}
Compilation message
circuit.cpp: In function 'void get_cnt(int)':
circuit.cpp:16:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
16 | for (int i = 0; i < adj[v].size(); i++) {
| ~~^~~~~~~~~~~~~~~
circuit.cpp: In function 'long long int get_wgt(int, int)':
circuit.cpp:25:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
25 | for (int i = 0; i < adj[v].size(); i++) {
| ~~^~~~~~~~~~~~~~~
circuit.cpp:29:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
29 | for (int j = 0; j < adj[v].size(); j++) {
| ~~^~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5072 KB |
Output is correct |
2 |
Correct |
3 ms |
5072 KB |
Output is correct |
3 |
Correct |
9 ms |
5120 KB |
Output is correct |
4 |
Correct |
9 ms |
5072 KB |
Output is correct |
5 |
Correct |
9 ms |
5128 KB |
Output is correct |
6 |
Correct |
10 ms |
5172 KB |
Output is correct |
7 |
Correct |
9 ms |
5072 KB |
Output is correct |
8 |
Correct |
11 ms |
5108 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5072 KB |
Output is correct |
2 |
Incorrect |
3 ms |
5072 KB |
3rd lines differ - on the 1st token, expected: '585825652', found: '-414176370' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5072 KB |
Output is correct |
2 |
Correct |
3 ms |
5072 KB |
Output is correct |
3 |
Correct |
9 ms |
5120 KB |
Output is correct |
4 |
Correct |
9 ms |
5072 KB |
Output is correct |
5 |
Correct |
9 ms |
5128 KB |
Output is correct |
6 |
Correct |
10 ms |
5172 KB |
Output is correct |
7 |
Correct |
9 ms |
5072 KB |
Output is correct |
8 |
Correct |
11 ms |
5108 KB |
Output is correct |
9 |
Correct |
3 ms |
5072 KB |
Output is correct |
10 |
Incorrect |
3 ms |
5072 KB |
3rd lines differ - on the 1st token, expected: '585825652', found: '-414176370' |
11 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3034 ms |
8216 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3034 ms |
8216 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5072 KB |
Output is correct |
2 |
Incorrect |
3 ms |
5072 KB |
3rd lines differ - on the 1st token, expected: '585825652', found: '-414176370' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5072 KB |
Output is correct |
2 |
Correct |
3 ms |
5072 KB |
Output is correct |
3 |
Correct |
9 ms |
5120 KB |
Output is correct |
4 |
Correct |
9 ms |
5072 KB |
Output is correct |
5 |
Correct |
9 ms |
5128 KB |
Output is correct |
6 |
Correct |
10 ms |
5172 KB |
Output is correct |
7 |
Correct |
9 ms |
5072 KB |
Output is correct |
8 |
Correct |
11 ms |
5108 KB |
Output is correct |
9 |
Correct |
3 ms |
5072 KB |
Output is correct |
10 |
Incorrect |
3 ms |
5072 KB |
3rd lines differ - on the 1st token, expected: '585825652', found: '-414176370' |
11 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5072 KB |
Output is correct |
2 |
Correct |
3 ms |
5072 KB |
Output is correct |
3 |
Correct |
9 ms |
5120 KB |
Output is correct |
4 |
Correct |
9 ms |
5072 KB |
Output is correct |
5 |
Correct |
9 ms |
5128 KB |
Output is correct |
6 |
Correct |
10 ms |
5172 KB |
Output is correct |
7 |
Correct |
9 ms |
5072 KB |
Output is correct |
8 |
Correct |
11 ms |
5108 KB |
Output is correct |
9 |
Correct |
3 ms |
5072 KB |
Output is correct |
10 |
Incorrect |
3 ms |
5072 KB |
3rd lines differ - on the 1st token, expected: '585825652', found: '-414176370' |
11 |
Halted |
0 ms |
0 KB |
- |