Submission #469395

# Submission time Handle Problem Language Result Execution time Memory
469395 2021-08-31T19:51:20 Z sinamhdv Sumtree (INOI20_sumtree) C++11
30 / 100
3000 ms 36012 KB
// INOI20_sumtree
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod = 1000 * 1000 * 1000 + 7;
const int INF = 1e9 + 100;
const ll LINF = 1e18 + 100;

#ifdef DEBUG
#define dbg(x) cout << #x << " = " << (x) << endl << flush;
#define dbgr(s, f) { cout << #s << ": "; for (auto _ = (s); _ != (f); _++) cout << *_ << ' '; cout << endl << flush; }
#else
#define dbg(x) ;
#define dbgr(s, f) ;
#endif
#define fast_io ios::sync_with_stdio(0); cin.tie(0);
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define fr first
#define sc second
#define endl '\n'

const int MAXN = 200100;
const int MAXF = 500100;
const int LOGN = 25;

inline int poww(int a, int b)
{
	int res = 1;
	for (; b; a = (ll)a * a % mod, b /= 2) if (b & 1) res = (ll)res * a % mod;
	return res;
}

int n, rt, q;
vector<int> adj[MAXN];
int bad, ans;
int sttime[MAXN], fntime[MAXN], timer, h[MAXN];
int lbl[MAXN], val[MAXN], cnt[MAXN];
int fact[MAXF], finv[MAXF];
int subtree[MAXN];
int revst[MAXN];

inline int comb(int n, int k)
{
	return (fact[n] * (ll)finv[k] % mod) * finv[n - k] % mod;
}

void dfs1(int v, int par = -1)
{
	subtree[v] = 1;
	sttime[v] = timer++;
	revst[sttime[v]] = v;
	for (int u : adj[v]) if (u != par)
	{
		h[u] = h[v] + 1, dfs1(u, v);
		subtree[v] += subtree[u];
	}
	fntime[v] = timer;
}

struct FEN
{
	ll fen[MAXN];

	inline void add(int i, ll x)
	{
		for (i++; i < MAXN; i += i & -i) fen[i] += x;
	}

	inline ll pget(int i)
	{
		ll res = 0;
		for (i++; i > 0; i -= i & -i) res += fen[i];
		return res;
	}

	inline ll get(int l, int r)
	{
		if (l > r) return 0;
		return pget(r) - pget(l - 1);
	}

} valfen, cntfen;

inline void addans(int i)
{
	if (val[i] < 0) bad++;
	else ans = (ll)ans * comb(val[i] + cnt[i] - 1, cnt[i] - 1) % mod;
}

inline void remans(int i)
{
	if (val[i] < 0) bad--;
	else ans = (ll)ans * poww(comb(val[i] + cnt[i] - 1, cnt[i] - 1), mod - 2) % mod;
}

inline void updateval(int v)
{
	ll nw = lbl[v] - valfen.get(sttime[v] + 1, fntime[v] - 1);
	valfen.add(sttime[v], nw - val[v]);
	val[v] = nw;
}

inline void updatecnt(int v)
{
	int nw = subtree[v] - cntfen.get(sttime[v] + 1, fntime[v] - 1);
	cntfen.add(sttime[v], nw - cnt[v]);
	cnt[v] = nw;
}

int seg[4 * MAXN];

void build(int v = 1, int l = 0, int r = n - 1)
{
	seg[0] = fntime[1];
}

void setind(int i, int x)
{
	seg[i] = x;
}

int segbs(int L, int R, int x)
{
	for (int i = R; i >= L; i--) if (seg[i] >= x) return i;
	assert(false);
	return 0;
}

int32_t main(void)
{
	fast_io;

	fact[0] = 1;
	FOR(i, 1, MAXF) fact[i] = fact[i - 1] * (ll)i % mod;
	finv[MAXF - 1] = poww(fact[MAXF - 1], mod - 2);
	for (int i = MAXF - 2; i >= 0; i--) finv[i] = (ll)finv[i + 1] * (i + 1) % mod;

	cin >> n >> rt;
	FOR(i, 0, n - 1)
	{
		int x, y;
		cin >> x >> y;
		adj[x].pb(y);
		adj[y].pb(x);
	}

	dfs1(1);

	ans = comb(n + rt - 1, n - 1);
	cout << ans << endl;

	lbl[1] = val[1] = rt;
	cnt[1] = n;
	valfen.add(0, val[1]);
	cntfen.add(0, cnt[1]);
	build();

	cin >> q;
	while (q--)
	{
		int op, v;
		cin >> op >> v;
		if (op == 1)	// add
		{
			int x;
			cin >> x;
			lbl[v] = x;

			// update anc
			int l = revst[segbs(0, sttime[v] - 1, fntime[v])];
			setind(sttime[v], fntime[v]);

			remans(l);

			// update cnt
			updatecnt(v);
			updatecnt(l);

			// update val
			updateval(v);
			updateval(l);

			addans(v);
			addans(l);
		}
		else	// rem
		{
			setind(sttime[v], 0);
			int l = revst[segbs(0, sttime[v] - 1, fntime[v])];

			remans(l);
			remans(v);

			cntfen.add(sttime[v], -cnt[v]);
			cnt[v] = 0;
			updatecnt(l);

			valfen.add(sttime[v], -val[v]);
			lbl[v] = val[v] = 0;
			updateval(l);

			addans(l);
		}

		ans = (mod + ans % mod) % mod;
		if (bad) cout << "0\n";
		else cout << ans << endl;
	}

	return 0;
}


# Verdict Execution time Memory Grader output
1 Correct 152 ms 26976 KB Output is correct
2 Correct 135 ms 27052 KB Output is correct
3 Correct 141 ms 26968 KB Output is correct
4 Correct 141 ms 27020 KB Output is correct
5 Correct 136 ms 23176 KB Output is correct
6 Correct 13 ms 9372 KB Output is correct
7 Correct 13 ms 9164 KB Output is correct
8 Correct 13 ms 9248 KB Output is correct
9 Correct 138 ms 19416 KB Output is correct
10 Correct 137 ms 19288 KB Output is correct
11 Correct 144 ms 19400 KB Output is correct
12 Correct 133 ms 18884 KB Output is correct
13 Correct 121 ms 26024 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 9048 KB Output is correct
2 Correct 12 ms 9068 KB Output is correct
3 Correct 12 ms 8968 KB Output is correct
4 Correct 12 ms 8988 KB Output is correct
5 Correct 14 ms 9036 KB Output is correct
6 Correct 15 ms 9164 KB Output is correct
7 Correct 15 ms 9228 KB Output is correct
8 Correct 15 ms 9148 KB Output is correct
9 Correct 17 ms 9292 KB Output is correct
10 Correct 17 ms 9380 KB Output is correct
11 Correct 16 ms 9276 KB Output is correct
12 Correct 13 ms 9284 KB Output is correct
13 Correct 16 ms 9292 KB Output is correct
14 Correct 16 ms 9340 KB Output is correct
15 Correct 16 ms 9452 KB Output is correct
16 Correct 18 ms 9292 KB Output is correct
17 Correct 16 ms 9236 KB Output is correct
18 Correct 15 ms 9156 KB Output is correct
19 Correct 17 ms 9232 KB Output is correct
20 Correct 14 ms 9216 KB Output is correct
21 Correct 15 ms 9220 KB Output is correct
22 Correct 14 ms 9088 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 262 ms 32484 KB Output is correct
2 Correct 451 ms 32864 KB Output is correct
3 Correct 251 ms 33348 KB Output is correct
4 Correct 672 ms 33780 KB Output is correct
5 Correct 263 ms 30496 KB Output is correct
6 Correct 15 ms 9464 KB Output is correct
7 Correct 14 ms 9292 KB Output is correct
8 Correct 14 ms 9292 KB Output is correct
9 Correct 635 ms 26692 KB Output is correct
10 Correct 842 ms 26528 KB Output is correct
11 Correct 590 ms 26436 KB Output is correct
12 Correct 1391 ms 25932 KB Output is correct
13 Execution timed out 3061 ms 36012 KB Time limit exceeded
14 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3071 ms 26328 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 152 ms 26976 KB Output is correct
2 Correct 135 ms 27052 KB Output is correct
3 Correct 141 ms 26968 KB Output is correct
4 Correct 141 ms 27020 KB Output is correct
5 Correct 136 ms 23176 KB Output is correct
6 Correct 13 ms 9372 KB Output is correct
7 Correct 13 ms 9164 KB Output is correct
8 Correct 13 ms 9248 KB Output is correct
9 Correct 138 ms 19416 KB Output is correct
10 Correct 137 ms 19288 KB Output is correct
11 Correct 144 ms 19400 KB Output is correct
12 Correct 133 ms 18884 KB Output is correct
13 Correct 121 ms 26024 KB Output is correct
14 Correct 12 ms 9048 KB Output is correct
15 Correct 12 ms 9068 KB Output is correct
16 Correct 12 ms 8968 KB Output is correct
17 Correct 12 ms 8988 KB Output is correct
18 Correct 14 ms 9036 KB Output is correct
19 Correct 15 ms 9164 KB Output is correct
20 Correct 15 ms 9228 KB Output is correct
21 Correct 15 ms 9148 KB Output is correct
22 Correct 17 ms 9292 KB Output is correct
23 Correct 17 ms 9380 KB Output is correct
24 Correct 16 ms 9276 KB Output is correct
25 Correct 13 ms 9284 KB Output is correct
26 Correct 16 ms 9292 KB Output is correct
27 Correct 16 ms 9340 KB Output is correct
28 Correct 16 ms 9452 KB Output is correct
29 Correct 18 ms 9292 KB Output is correct
30 Correct 16 ms 9236 KB Output is correct
31 Correct 15 ms 9156 KB Output is correct
32 Correct 17 ms 9232 KB Output is correct
33 Correct 14 ms 9216 KB Output is correct
34 Correct 15 ms 9220 KB Output is correct
35 Correct 14 ms 9088 KB Output is correct
36 Correct 262 ms 32484 KB Output is correct
37 Correct 451 ms 32864 KB Output is correct
38 Correct 251 ms 33348 KB Output is correct
39 Correct 672 ms 33780 KB Output is correct
40 Correct 263 ms 30496 KB Output is correct
41 Correct 15 ms 9464 KB Output is correct
42 Correct 14 ms 9292 KB Output is correct
43 Correct 14 ms 9292 KB Output is correct
44 Correct 635 ms 26692 KB Output is correct
45 Correct 842 ms 26528 KB Output is correct
46 Correct 590 ms 26436 KB Output is correct
47 Correct 1391 ms 25932 KB Output is correct
48 Execution timed out 3061 ms 36012 KB Time limit exceeded
49 Halted 0 ms 0 KB -