#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 100'001;
const int MAXK = 20;
struct Node {
Node *l, *r;
ll sum = 0;
int cnt = 0;
Node(ll x, int y) : sum(x), cnt(y), l(nullptr), r(nullptr) {}
Node(Node *a, Node *b) : l(a), r(b) {
if (a) {
sum += a->sum;
cnt += a->cnt;
}
if (b) {
sum += b->sum;
cnt += b->cnt;
}
}
};
Node *build(int tl, int tr) {
if (tl == tr) {
return new Node(0, 0);
} else {
int tm = (tl + tr) / 2;
return new Node(build(tl, tm), build(tm+1, tr));
}
}
Node *upd(Node *v, int tl, int tr, int pos, ll val, ll cnt) {
if (tl == tr) {
return new Node(v->sum + val, v->cnt + cnt);
} else {
int tm = (tl + tr) / 2;
if (pos <= tm) {
return new Node(upd(v->l, tl, tm, pos, val, cnt), v->r);
} else {
return new Node(v->l, upd(v->r, tm+1, tr, pos, val, cnt));
}
}
}
ll qry(Node *u, Node *v, Node *lca, int tl, int tr, ll silver) {
if (tl == tr) {
ll val = u->sum + v->sum - 2 * lca->sum;
ll golds = u->cnt + v->cnt - 2 * lca->cnt;
ll base = golds ? val / golds : 0;
ll bought = base ? silver / base : 0;
return max(0ll, golds - bought);
} else {
int tm = (tl + tr) / 2;
ll val = u->l->sum + v->l->sum - 2 * lca->l->sum;
if (val <= silver) {
return qry(u->r, v->r, lca->r, tm+1, tr, silver - val);
} else {
ll golds = u->r->cnt + v->r->cnt - 2 * lca->r->cnt;
return golds + qry(u->l, v->l, lca->l, tl, tm, silver);
}
}
}
vector<int> g[MAXN];
int up[MAXN][MAXK], tin[MAXN], tout[MAXN], n, m, q, timer = 1;
Node *root[MAXN];
vector<ll> checkpoints[MAXN];
void dfs(int u, int p = -1) {
tin[u] = timer++;
for (int v : g[u]) {
if (v != p) {
up[v][0] = u;
dfs(v, u);
}
}
tout[u] = timer++;
}
bool is_ancestor(int u, int v) {
return tin[u] <= tin[v] && tout[v] <= tout[u];
}
int lca(int u, int v) {
if (is_ancestor(u, v)) return u;
if (is_ancestor(v, u)) return v;
for (int k = MAXK-1; k >= 0; k--) {
if (up[u][k] && !is_ancestor(up[u][k], v)) {
u = up[u][k];
}
}
return up[u][0];
}
void prelift() {
dfs(1);
for (int k = 1; k < MAXK; k++) {
for (int i = 1; i <= n; i++) {
up[i][k] = up[up[i][k-1]][k-1];
}
}
}
void dfs2(const vector<int> &comp, int u, int p = -1) {
if (p == -1) {
root[u] = build(1, n);
} else {
root[u] = root[up[u][0]];
for (ll c : checkpoints[u]) {
int pos = lower_bound(comp.begin(), comp.end(), c)-comp.begin();
root[u] = upd(root[u], 1, n, pos, c, 1);
}
}
for (int v : g[u]) {
if (v != p) dfs2(comp, v, u);
}
}
vector<int> comp = {0};
void build_tree() {
sort(comp.begin(), comp.end());
comp.erase(unique(comp.begin(), comp.end()), comp.end());
g[0].emplace_back(1);
dfs2(comp, 0);
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> m >> q;
vector<pair<int, int>> edges;
for (int i = 1; i <= n-1; i++) {
int u, v; cin >> u >> v;
edges.emplace_back(u, v);
g[u].emplace_back(v);
g[v].emplace_back(u);
}
prelift();
for (int i = 1; i <= m; i++) {
ll p, c; cin >> p >> c;
auto [u, v] = edges[p-1];
if (tin[u] > tin[v]) swap(u, v);
comp.emplace_back(c);
checkpoints[v].emplace_back(c);
}
build_tree();
while (q--) {
ll s, t, x, y; cin >> s >> t >> x >> y;
int v = lca(s, t);
cout << max(-1ll, x-qry(root[s], root[t], root[v], 1, n, y)) << "\n";
}
return 0;
}
Compilation message
currencies.cpp: In constructor 'Node::Node(ll, int)':
currencies.cpp:12:9: warning: 'Node::cnt' will be initialized after [-Wreorder]
12 | int cnt = 0;
| ^~~
currencies.cpp:10:11: warning: 'Node* Node::l' [-Wreorder]
10 | Node *l, *r;
| ^
currencies.cpp:14:5: warning: when initialized here [-Wreorder]
14 | Node(ll x, int y) : sum(x), cnt(y), l(nullptr), r(nullptr) {}
| ^~~~
currencies.cpp: In function 'int main()':
currencies.cpp:148:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
148 | auto [u, v] = edges[p-1];
| ^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
8284 KB |
Output is correct |
2 |
Correct |
2 ms |
8284 KB |
Output is correct |
3 |
Correct |
2 ms |
8284 KB |
Output is correct |
4 |
Correct |
3 ms |
8304 KB |
Output is correct |
5 |
Correct |
5 ms |
9564 KB |
Output is correct |
6 |
Correct |
7 ms |
9824 KB |
Output is correct |
7 |
Incorrect |
6 ms |
9308 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
8284 KB |
Output is correct |
2 |
Correct |
5 ms |
9820 KB |
Output is correct |
3 |
Correct |
4 ms |
9844 KB |
Output is correct |
4 |
Correct |
5 ms |
9816 KB |
Output is correct |
5 |
Correct |
194 ms |
106416 KB |
Output is correct |
6 |
Correct |
202 ms |
95496 KB |
Output is correct |
7 |
Correct |
185 ms |
83220 KB |
Output is correct |
8 |
Correct |
162 ms |
80832 KB |
Output is correct |
9 |
Correct |
206 ms |
85828 KB |
Output is correct |
10 |
Correct |
259 ms |
115080 KB |
Output is correct |
11 |
Correct |
259 ms |
115140 KB |
Output is correct |
12 |
Correct |
259 ms |
115268 KB |
Output is correct |
13 |
Correct |
298 ms |
115144 KB |
Output is correct |
14 |
Correct |
264 ms |
115100 KB |
Output is correct |
15 |
Correct |
276 ms |
122304 KB |
Output is correct |
16 |
Correct |
264 ms |
122816 KB |
Output is correct |
17 |
Correct |
286 ms |
122112 KB |
Output is correct |
18 |
Correct |
292 ms |
115464 KB |
Output is correct |
19 |
Correct |
327 ms |
115192 KB |
Output is correct |
20 |
Correct |
293 ms |
115392 KB |
Output is correct |
21 |
Correct |
221 ms |
115588 KB |
Output is correct |
22 |
Correct |
229 ms |
115472 KB |
Output is correct |
23 |
Correct |
214 ms |
115516 KB |
Output is correct |
24 |
Correct |
222 ms |
115448 KB |
Output is correct |
25 |
Correct |
217 ms |
114932 KB |
Output is correct |
26 |
Correct |
242 ms |
115188 KB |
Output is correct |
27 |
Correct |
220 ms |
114920 KB |
Output is correct |
28 |
Correct |
211 ms |
115172 KB |
Output is correct |
29 |
Correct |
200 ms |
115340 KB |
Output is correct |
30 |
Correct |
197 ms |
115140 KB |
Output is correct |
31 |
Correct |
206 ms |
115280 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
8280 KB |
Output is correct |
2 |
Correct |
6 ms |
9820 KB |
Output is correct |
3 |
Correct |
5 ms |
10076 KB |
Output is correct |
4 |
Correct |
5 ms |
10076 KB |
Output is correct |
5 |
Correct |
260 ms |
94752 KB |
Output is correct |
6 |
Correct |
237 ms |
82372 KB |
Output is correct |
7 |
Incorrect |
293 ms |
102956 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
8284 KB |
Output is correct |
2 |
Correct |
2 ms |
8284 KB |
Output is correct |
3 |
Correct |
2 ms |
8284 KB |
Output is correct |
4 |
Correct |
3 ms |
8304 KB |
Output is correct |
5 |
Correct |
5 ms |
9564 KB |
Output is correct |
6 |
Correct |
7 ms |
9824 KB |
Output is correct |
7 |
Incorrect |
6 ms |
9308 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |