#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 12, maxk = 2e5 + 12, lg = 18, mod = 1e9 + 7;
int n, bs, tz, tms, h[maxk], col[maxk], par[maxk][lg], sz[maxk], st[maxk], en[maxk], sum1[maxk * 3], sum2[maxk * 3];
long long ans, fact[maxn], rfact[maxn];
set <int> Q[maxk * 3];
vector <int> conn[maxk];
bitset <maxn> marked, zero;
long long tav(long long a, long long b){
if(b == 0)
return 1;
a %= mod;
long long x = tav(a * a % mod, b / 2);
if(b % 2)
return x * a % mod;
return x % mod;
}
void update_tree1(int l, int r, int u, int k, int L = 0, int R = n){
if(r < L || R < l)
return;
if(l <= L && R <= r){
sum1[u] = k;
return;
}
int mid = (L + R) / 2;
update_tree1(l, r, u * 2, k, L, mid);
update_tree1(l, r, u * 2 + 1, k, mid + 1, R);
sum1[u] = sum1[u * 2] + sum1[u * 2 + 1];
}
void update_tree2(int l, int r, int u, int k, int L = 0, int R = n){
if(r < L || R < l)
return;
if(l <= L && R <= r){
sum2[u] = k;
return;
}
int mid = (L + R) / 2;
update_tree2(l, r, u * 2, k, L, mid);
update_tree2(l, r, u * 2 + 1, k, mid + 1, R);
sum2[u] = sum2[u * 2] + sum2[u * 2 + 1];
}
int get_sum1(int l, int r, int u, int L = 0, int R = n){
if(r < L || R < l)
return 0;
if(l <= L && R <= r)
return sum1[u];
int mid = (L + R) / 2;
return get_sum1(l, r, u * 2, L, mid) + get_sum1(l, r, u * 2 + 1, mid + 1, R);
}
int get_sum2(int l, int r, int u, int L = 0, int R = n){
if(r < L || R < l)
return 0;
if(l <= L && R <= r)
return sum2[u];
int mid = (L + R) / 2;
return get_sum2(l, r, u * 2, L, mid) + get_sum2(l, r, u * 2 + 1, mid + 1, R);
}
int kpar(int u, int k){
for(int i = 0; i < lg; i++)
if((k >> i) & 1)
u = par[u][i];
return u;
}
void dfs_set(int u){
marked[u] = 1;
sz[u] = 1;
st[u] = tms;
tms += 1;
for(int i = 0; i + 1 < lg; i++)
par[u][i + 1] = par[par[u][i]][i];
for(int v: conn[u])
if(!marked[v]){
par[v][0] = u;
h[v] = h[u] + 1;
dfs_set(v);
sz[u] += sz[v];
}
en[u] = tms - 1;
}
void add_to_tree(int l, int r, int u, int k, int L = 0, int R = n){
if(r < L || R < l)
return;
if(l <= L && R <= r){
Q[u].insert(h[k]);
return;
}
int mid = (L + R) / 2;
add_to_tree(l, r, u * 2, k, L, mid);
add_to_tree(l, r, u * 2 + 1, k, mid + 1, R);
}
void erase_from_tree(int l, int r, int u, int k, int L = 0, int R = n){
if(r < L || R < l)
return;
if(l <= L && R <= r){
Q[u].erase(Q[u].lower_bound(h[k]));
return;
}
int mid = (L + R) / 2;
erase_from_tree(l, r, u * 2, k, L, mid);
erase_from_tree(l, r, u * 2 + 1, k, mid + 1, R);
}
int find_pd(int l, int r, int u, int L = 0, int R = n){
if(r < L || R < l)
return -1;
if(l <= L && R <= r){
if(Q[u].size() == 0)
return -1;
return *Q[u].rbegin();
}
auto x = -1;
if(Q[u].size())
x = *Q[u].rbegin();
int mid = (L + R) / 2;
return max({find_pd(l, r, u * 2, L, mid), find_pd(l, r, u * 2 + 1, mid + 1, R), x});
}
long long get_c(int a, int b){
if(a < b)
return 0;
return fact[a] * (rfact[b] * rfact[a - b] % mod) % mod;
}
void add_tree(int u, int k){
int pd = find_pd(st[u], st[u], 1);
// cout << pd << endl;
pd = kpar(u, h[u] - pd);
// cout << u << ' ' << pd << endl;
// cout << u << ' ' << pd << endl;
col[u] = k;
if(u != 1){
int x = get_sum1(st[pd] + 1, en[pd], 1);
int d = get_sum2(st[pd] + 1, en[pd], 1);
if(zero[pd] == 0){
x = sz[pd] - x;
d = col[pd] - d;
long long f = get_c(d + x - 1, x - 1);
ans = ans * tav(f, mod - 2) % mod;
}
}
// cout << ans << endl;
int x = get_sum1(st[u], en[u], 1);
int d = get_sum2(st[u], en[u], 1);
update_tree1(st[u], st[u], 1, sz[u] - x);
update_tree2(st[u], st[u], 1, k - d);
add_to_tree(st[u] + 1, en[u], 1, u);
// cout << st[pd] << '-' << en[pd] << endl;
if(k < d){
zero[u] = 1;
tz += 1;
}
else{
// cout << x << ' ' << sz[u] << endl;
x = sz[u] - x;
d = k - d;
// cout << x << ' ' << d << endl;
long long f = get_c(d + x - 1, x - 1);
ans = ans * f % mod;
}
// cout << ans << endl;
if(u != 1){
int x = get_sum1(st[pd] + 1, en[pd], 1);
int d = get_sum2(st[pd] + 1, en[pd], 1);
update_tree1(st[pd], st[pd], 1, sz[pd] - x);
update_tree2(st[pd], st[pd], 1, col[pd] - d);
if(col[pd] < d){
tz += (1 - zero[pd]);
zero[pd] = 1;
}
else{
x = sz[pd] - x;
d = col[pd] - d;
tz -= zero[pd];
zero[pd] = 0;
// cout << x << ' ' << d << endl;
long long f = get_c(d + x - 1, x - 1);
ans = ans * f % mod;
}
}
//cout << ans << endl << endl;
}
void remove_tree(int u){
int pd = find_pd(st[u], st[u], 1);
// cout << pd << endl;
pd = kpar(u, h[u] - pd);
// cout << u << ' ' << pd << endl;
int x = get_sum1(st[pd] + 1, en[pd], 1);
int d = get_sum2(st[pd] + 1, en[pd], 1);
if(zero[pd] == 0){
x = sz[pd] - x;
d = col[pd] - d;
long long f = get_c(d + x - 1, x - 1);
ans = ans * tav(f, mod - 2) % mod;
}
x = get_sum1(st[u] + 1, en[u], 1);
d = get_sum2(st[u] + 1, en[u], 1);
update_tree1(st[u], st[u], 1, 0);
update_tree2(st[u], st[u], 1, 0);
erase_from_tree(st[u] + 1, en[u], 1, u);
//cout << get_sum1(1, n, 1) << endl;
if(col[u] < d){
tz -= zero[u];
zero[u] = 0;
}
else{
tz -= zero[u];
zero[u] = 0;
x = sz[u] - x;
d = col[u] - d;
// cout << d << ' ' << x << endl;
long long f = get_c(d + x - 1, x - 1);
ans = ans * tav(f, mod - 2) % mod;
}
col[u] = -1;
x = get_sum1(st[pd] + 1, en[pd], 1);
d = get_sum2(st[pd] + 1, en[pd], 1);
update_tree1(st[pd], st[pd], 1, sz[pd] - x);
update_tree2(st[pd], st[pd], 1, col[pd] - d);
if(col[pd] < d){
tz += (1 - zero[pd]);
zero[pd] = 1;
}
else{
tz -= (zero[pd]);
zero[pd] = 0;
x = sz[pd] - x;
d = col[pd] - d;
// cout << d << ' ' << x << endl;
long long f = get_c(d + x - 1, x - 1);
ans = ans * f % mod;
}
}
int main(){
ios_base::sync_with_stdio(false), cin.tie(0);
memset(col, -1, sizeof col);
col[0] = 0;
fact[0] = 1;
for(int i = 1; i < maxn; i++)
fact[i] = fact[i - 1] * i % mod;
for(int i = 0; i < maxn; i++)
rfact[i] = tav(fact[i], mod - 2) % mod;
cin >> n >> bs;
for(int i = 0; i < n - 1; i++){
int a, b;
cin >> a >> b;
conn[a].push_back(b);
conn[b].push_back(a);
}
cout << endl;
dfs_set(1);
ans = 1;
add_tree(1, bs);
cout << ans << "\n";
int q;
cin >> q;
for(int i = 0; i < q; i++){
int a;
int b, c;
cin >> a;
if(a == 1){
cin >> b >> c;
add_tree(b, c);
}
else{
cin >> b;
remove_tree(b);
}
if(tz)
cout << 0 << "\n";
else
cout << ans << "\n";
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
251 ms |
73720 KB |
Output is correct |
2 |
Correct |
229 ms |
73716 KB |
Output is correct |
3 |
Correct |
284 ms |
73668 KB |
Output is correct |
4 |
Correct |
254 ms |
73752 KB |
Output is correct |
5 |
Correct |
202 ms |
69772 KB |
Output is correct |
6 |
Correct |
119 ms |
42532 KB |
Output is correct |
7 |
Correct |
131 ms |
42176 KB |
Output is correct |
8 |
Correct |
121 ms |
42276 KB |
Output is correct |
9 |
Correct |
239 ms |
66056 KB |
Output is correct |
10 |
Correct |
303 ms |
65960 KB |
Output is correct |
11 |
Correct |
269 ms |
66056 KB |
Output is correct |
12 |
Correct |
259 ms |
64996 KB |
Output is correct |
13 |
Correct |
249 ms |
71356 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
120 ms |
41800 KB |
Output is correct |
2 |
Correct |
124 ms |
41820 KB |
Output is correct |
3 |
Correct |
122 ms |
41796 KB |
Output is correct |
4 |
Correct |
122 ms |
41820 KB |
Output is correct |
5 |
Correct |
125 ms |
41908 KB |
Output is correct |
6 |
Correct |
127 ms |
42144 KB |
Output is correct |
7 |
Correct |
137 ms |
42196 KB |
Output is correct |
8 |
Correct |
128 ms |
42116 KB |
Output is correct |
9 |
Correct |
132 ms |
42384 KB |
Output is correct |
10 |
Correct |
130 ms |
42516 KB |
Output is correct |
11 |
Correct |
132 ms |
42552 KB |
Output is correct |
12 |
Correct |
125 ms |
42316 KB |
Output is correct |
13 |
Correct |
133 ms |
42524 KB |
Output is correct |
14 |
Correct |
134 ms |
42416 KB |
Output is correct |
15 |
Correct |
132 ms |
42836 KB |
Output is correct |
16 |
Correct |
126 ms |
42336 KB |
Output is correct |
17 |
Correct |
129 ms |
42448 KB |
Output is correct |
18 |
Correct |
134 ms |
42332 KB |
Output is correct |
19 |
Correct |
132 ms |
42324 KB |
Output is correct |
20 |
Correct |
130 ms |
42156 KB |
Output is correct |
21 |
Correct |
124 ms |
42132 KB |
Output is correct |
22 |
Correct |
124 ms |
41836 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
278 ms |
79624 KB |
Output is correct |
2 |
Correct |
368 ms |
84860 KB |
Output is correct |
3 |
Correct |
337 ms |
80608 KB |
Output is correct |
4 |
Correct |
527 ms |
94092 KB |
Output is correct |
5 |
Correct |
1147 ms |
146076 KB |
Output is correct |
6 |
Correct |
124 ms |
43104 KB |
Output is correct |
7 |
Correct |
123 ms |
42328 KB |
Output is correct |
8 |
Correct |
130 ms |
42656 KB |
Output is correct |
9 |
Correct |
673 ms |
76868 KB |
Output is correct |
10 |
Correct |
614 ms |
75208 KB |
Output is correct |
11 |
Correct |
558 ms |
74644 KB |
Output is correct |
12 |
Correct |
606 ms |
75168 KB |
Output is correct |
13 |
Correct |
2261 ms |
303656 KB |
Output is correct |
14 |
Correct |
2229 ms |
303392 KB |
Output is correct |
15 |
Correct |
2245 ms |
303396 KB |
Output is correct |
16 |
Correct |
2185 ms |
303420 KB |
Output is correct |
17 |
Correct |
2171 ms |
303340 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
863 ms |
71648 KB |
Output is correct |
2 |
Correct |
830 ms |
71660 KB |
Output is correct |
3 |
Correct |
906 ms |
71624 KB |
Output is correct |
4 |
Correct |
859 ms |
71676 KB |
Output is correct |
5 |
Correct |
964 ms |
70396 KB |
Output is correct |
6 |
Correct |
806 ms |
71664 KB |
Output is correct |
7 |
Correct |
684 ms |
57768 KB |
Output is correct |
8 |
Correct |
710 ms |
57840 KB |
Output is correct |
9 |
Correct |
929 ms |
71680 KB |
Output is correct |
10 |
Correct |
841 ms |
71644 KB |
Output is correct |
11 |
Correct |
818 ms |
71660 KB |
Output is correct |
12 |
Correct |
683 ms |
57764 KB |
Output is correct |
13 |
Correct |
546 ms |
54772 KB |
Output is correct |
14 |
Correct |
611 ms |
55880 KB |
Output is correct |
15 |
Correct |
620 ms |
56136 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
251 ms |
73720 KB |
Output is correct |
2 |
Correct |
229 ms |
73716 KB |
Output is correct |
3 |
Correct |
284 ms |
73668 KB |
Output is correct |
4 |
Correct |
254 ms |
73752 KB |
Output is correct |
5 |
Correct |
202 ms |
69772 KB |
Output is correct |
6 |
Correct |
119 ms |
42532 KB |
Output is correct |
7 |
Correct |
131 ms |
42176 KB |
Output is correct |
8 |
Correct |
121 ms |
42276 KB |
Output is correct |
9 |
Correct |
239 ms |
66056 KB |
Output is correct |
10 |
Correct |
303 ms |
65960 KB |
Output is correct |
11 |
Correct |
269 ms |
66056 KB |
Output is correct |
12 |
Correct |
259 ms |
64996 KB |
Output is correct |
13 |
Correct |
249 ms |
71356 KB |
Output is correct |
14 |
Correct |
120 ms |
41800 KB |
Output is correct |
15 |
Correct |
124 ms |
41820 KB |
Output is correct |
16 |
Correct |
122 ms |
41796 KB |
Output is correct |
17 |
Correct |
122 ms |
41820 KB |
Output is correct |
18 |
Correct |
125 ms |
41908 KB |
Output is correct |
19 |
Correct |
127 ms |
42144 KB |
Output is correct |
20 |
Correct |
137 ms |
42196 KB |
Output is correct |
21 |
Correct |
128 ms |
42116 KB |
Output is correct |
22 |
Correct |
132 ms |
42384 KB |
Output is correct |
23 |
Correct |
130 ms |
42516 KB |
Output is correct |
24 |
Correct |
132 ms |
42552 KB |
Output is correct |
25 |
Correct |
125 ms |
42316 KB |
Output is correct |
26 |
Correct |
133 ms |
42524 KB |
Output is correct |
27 |
Correct |
134 ms |
42416 KB |
Output is correct |
28 |
Correct |
132 ms |
42836 KB |
Output is correct |
29 |
Correct |
126 ms |
42336 KB |
Output is correct |
30 |
Correct |
129 ms |
42448 KB |
Output is correct |
31 |
Correct |
134 ms |
42332 KB |
Output is correct |
32 |
Correct |
132 ms |
42324 KB |
Output is correct |
33 |
Correct |
130 ms |
42156 KB |
Output is correct |
34 |
Correct |
124 ms |
42132 KB |
Output is correct |
35 |
Correct |
124 ms |
41836 KB |
Output is correct |
36 |
Correct |
278 ms |
79624 KB |
Output is correct |
37 |
Correct |
368 ms |
84860 KB |
Output is correct |
38 |
Correct |
337 ms |
80608 KB |
Output is correct |
39 |
Correct |
527 ms |
94092 KB |
Output is correct |
40 |
Correct |
1147 ms |
146076 KB |
Output is correct |
41 |
Correct |
124 ms |
43104 KB |
Output is correct |
42 |
Correct |
123 ms |
42328 KB |
Output is correct |
43 |
Correct |
130 ms |
42656 KB |
Output is correct |
44 |
Correct |
673 ms |
76868 KB |
Output is correct |
45 |
Correct |
614 ms |
75208 KB |
Output is correct |
46 |
Correct |
558 ms |
74644 KB |
Output is correct |
47 |
Correct |
606 ms |
75168 KB |
Output is correct |
48 |
Correct |
2261 ms |
303656 KB |
Output is correct |
49 |
Correct |
2229 ms |
303392 KB |
Output is correct |
50 |
Correct |
2245 ms |
303396 KB |
Output is correct |
51 |
Correct |
2185 ms |
303420 KB |
Output is correct |
52 |
Correct |
2171 ms |
303340 KB |
Output is correct |
53 |
Correct |
863 ms |
71648 KB |
Output is correct |
54 |
Correct |
830 ms |
71660 KB |
Output is correct |
55 |
Correct |
906 ms |
71624 KB |
Output is correct |
56 |
Correct |
859 ms |
71676 KB |
Output is correct |
57 |
Correct |
964 ms |
70396 KB |
Output is correct |
58 |
Correct |
806 ms |
71664 KB |
Output is correct |
59 |
Correct |
684 ms |
57768 KB |
Output is correct |
60 |
Correct |
710 ms |
57840 KB |
Output is correct |
61 |
Correct |
929 ms |
71680 KB |
Output is correct |
62 |
Correct |
841 ms |
71644 KB |
Output is correct |
63 |
Correct |
818 ms |
71660 KB |
Output is correct |
64 |
Correct |
683 ms |
57764 KB |
Output is correct |
65 |
Correct |
546 ms |
54772 KB |
Output is correct |
66 |
Correct |
611 ms |
55880 KB |
Output is correct |
67 |
Correct |
620 ms |
56136 KB |
Output is correct |
68 |
Correct |
123 ms |
41780 KB |
Output is correct |
69 |
Correct |
120 ms |
41808 KB |
Output is correct |
70 |
Correct |
1025 ms |
79248 KB |
Output is correct |
71 |
Correct |
1027 ms |
79280 KB |
Output is correct |
72 |
Correct |
988 ms |
79232 KB |
Output is correct |
73 |
Correct |
987 ms |
79404 KB |
Output is correct |
74 |
Correct |
1200 ms |
79720 KB |
Output is correct |
75 |
Correct |
1109 ms |
75400 KB |
Output is correct |
76 |
Correct |
849 ms |
71648 KB |
Output is correct |
77 |
Correct |
953 ms |
72156 KB |
Output is correct |
78 |
Correct |
983 ms |
73380 KB |
Output is correct |
79 |
Correct |
979 ms |
75476 KB |
Output is correct |
80 |
Correct |
1077 ms |
74732 KB |
Output is correct |
81 |
Correct |
1071 ms |
75580 KB |
Output is correct |
82 |
Correct |
692 ms |
68012 KB |
Output is correct |
83 |
Correct |
687 ms |
75000 KB |
Output is correct |
84 |
Correct |
703 ms |
74276 KB |
Output is correct |
85 |
Correct |
688 ms |
74220 KB |
Output is correct |