Submission #1265814

#TimeUsernameProblemLanguageResultExecution timeMemory
1265814nanaseyuzukiTwo Currencies (JOI23_currencies)C++20
0 / 100
9 ms6156 KiB
#include <bits/stdc++.h> /* --> Author: Megumi_Kato__8703 "" */ #define int long long #define fi first #define se second #define pii pair<int, int> #define all(a) a.begin(), a.end() using namespace std; const int mn = 1e5 + 5; int n, m, q, st[mn], d[mn], sz[mn], heavy[mn], par[mn], head[mn], id[mn], ft[mn], euler[mn], l[mn], r[mn], timer = 0, chains = 0; pii edge[mn]; vector <int> a[mn], event[mn]; void pre_dfs(int u, int p){ sz[u] = 1; for(auto v : a[u]){ if(v == p) continue; par[v] = u; d[v] = d[u] + 1; pre_dfs(v, u); sz[u] += sz[v]; if(sz[v] > sz[heavy[u]]) heavy[u] = v; } } void decompose(int u, int h){ st[u] = ++timer; euler[timer] = u; head[u] = h, id[u] = chains; if(heavy[u]) decompose(heavy[u], h); for(auto v : a[u]){ if(v != par[u] && v != heavy[u]){ chains ++; decompose(v, v); } } ft[u] = timer; } int lca(int u, int v){ while(head[u] != head[v]){ if(d[head[u]] > d[head[v]]) u = par[head[u]]; else v = par[head[v]]; } return d[u] < d[v] ? u : v; } struct Megumi{ int u, v, w; bool operator<(const Megumi& other){ return w < other.w; } } e[mn]; struct query{ int s, t, x, y; } reina[mn]; int bit[2][mn], ans[mn]; void add(int c, int u, int val){ while(u <= n + 1){ bit[c][u] += val; u += (u & -u); } } int get(int c, int u){ int res = 0; while(u){ res += bit[c][u]; u -= (u & -u); } return res; } void solve(){ cin >> n >> m >> q; for(int i = 1; i <= n - 1; i++){ cin >> edge[i].fi >> edge[i].se; auto[u, v] = edge[i]; a[u].push_back(v); a[v].push_back(u); } pre_dfs(1, 0); decompose(1, 1); for(int i = 1; i <= m; i++){ int p, w; cin >> p >> w; auto[u, v] = edge[p]; if(v == par[u]) swap(u, v); e[i] = {u, v, w}; } sort(e + 1, e + m + 1); for(int i = 1; i <= q; i++){ ans[i] = - 2e9; cin >> reina[i].s >> reina[i].t >> reina[i].x >> reina[i].y; l[i] = 0, r[i] = m; } while(true){ bool ok = true; for(int i = 1; i <= q; i++){ if(l[i] <= r[i]){ ok = false; int mid = (l[i] + r[i]) >> 1; event[mid].push_back(i); } } if(ok) break; for(int i = 1; i <= m; i++){ auto[u, v, w] = e[i]; add(1, st[v], 1); add(1, ft[v] + 1, - 1); } for(int i = 0; i <= m; i++){ if(i > 0){ auto[u, v, w] = e[i]; add(0, st[v], w); add(1, st[v], - 1); add(0, ft[v] + 1, - w); add(1, ft[v] + 1, 1); } for(auto id : event[i]){ auto[s, t, x, y] = reina[id]; int p = lca(s, t); int w = get(0, st[s]) + get(0, st[t]) - 2 * get(0, st[p]); int nanase = get(1, st[s]) + get(1, st[t]) - 2 * get(1, st[p]); if(w <= y && nanase <= x){ ans[id] = max(ans[id], x - nanase); l[id] = i + 1; } else{ r[id] = i - 1; } } event[i].clear(); } for(int i = 1; i <= m; i++){ auto[u, v, w] = e[i]; add(0, st[v], - w); add(0, ft[v] + 1, w); } } for(int i = 1; i <= q; i++){ if(ans[i] > -2e9) cout << ans[i] << '\n'; else cout << -1 << '\n'; } } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; // cin >> t; while(t--){ solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...