Submission #1312977

#TimeUsernameProblemLanguageResultExecution timeMemory
13129774QT0RSumtree (INOI20_sumtree)C++20
10 / 100
283 ms31708 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const ll mod = 1e9 + 7; vector<ll> graph[200003]; ll fat[200003]; ll label_sum[200003]; ll label[200003]; ll siz[200003]; ll iter, seg_iter; void prep(ll v, ll p) { fat[v] = p; siz[v] = 1; for (auto u : graph[v]) { if (u == p) continue; prep(u, v); siz[v] += siz[u]; } } ll fact[500003]; ll fact_inv[500003]; ll fast_pow(ll a, ll b) { if (b == 1) return a; ll cur = fast_pow(a, b / 2); cur = (cur * cur) % mod; if (b & 1) cur = (cur * a) % mod; return cur; } void init(ll &n, ll &r, ll &q) { cin >> n >> r; for (ll i = 1, a, b; i < n; i++) { cin >> a >> b; graph[a].push_back(b); graph[b].push_back(a); } cin >> q; fill(label + 1, label + n + 1, -1); fact[0] = 1; for (ll i = 1; i <= 500002; i++) fact[i] = (i * fact[i - 1]) % mod; fact_inv[500002] = fast_pow(fact[500002], mod - 2); for (ll i = 500001; i >= 0; i--) fact_inv[i] = ((i + 1) * fact_inv[i + 1]) % mod; } ll res(ll siz, ll tag) { ll wyn = fact[siz + tag - 1]; wyn = (wyn * fact_inv[tag]) % mod; wyn = (wyn * fact_inv[siz - 1]) % mod; return wyn; } ll Find(ll v) { if (label[v] >= 0) return v; return Find(fat[v]); } void add(ll v, ll x, ll y) { while (v) { siz[v] += x; label_sum[v] += y; v = fat[v]; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n, r, q; init(n, r, q); prep(1, 0); label_sum[1] = r; label[1] = r; ll ans = res(n, label_sum[1]), neg_vert = 0; cout << ans << '\n'; for (ll i = 1, t, v, tag; i <= q; i++) { cin >> t >> v; if (t == 1) cin >> tag; ll up = Find(fat[v]); if (label_sum[up] < 0) neg_vert--; else ans = (ans * fast_pow(res(siz[up], label_sum[up]), mod - 2)) % mod; if (t == 1) { label[v] = tag; label_sum[v] += tag; add(fat[v], -siz[v], -label[v]); add(fat[up], siz[v], label[v]); label_sum[up] -= label_sum[v]; if (label_sum[v] < 0) neg_vert++; else ans = (ans * res(siz[v], label_sum[v])) % mod; } else { if (label_sum[v] < 0) neg_vert--; else ans = (ans * fast_pow(res(siz[v], label_sum[v]), mod - 2)) % mod; label_sum[up] += label_sum[v]; add(fat[up], -siz[v], -label[v]); add(fat[v], siz[v], label[v]); label_sum[v] -= label[v]; label[v] = -1; } if (label_sum[up] < 0) neg_vert++; else ans = (ans * res(siz[up], label_sum[up])) % mod; if (neg_vert) cout << "0\n"; else cout << ans << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...