Submission #1242883

#TimeUsernameProblemLanguageResultExecution timeMemory
1242883Hamed_GhaffariTwo Currencies (JOI23_currencies)C++20
0 / 100
5 ms6724 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define X first #define Y second const int MXN = 1e5+5, LOG = 17; int n; template<typename T> struct Fen { T fen[MXN]; inline void upd(int s, int e, T x) { for(++s; s<=n; s+=s&-s) fen[s] += x; for(++e; e<=n; e+=e&-e) fen[e] -= x; } inline T get(int p) { T res=0; for(++p; p; p-=p&-p) res += fen[p]; return res; } }; Fen<ll> f0; Fen<int> f1; vector<int> g[MXN]; int A[MXN], B[MXN], par[MXN], jp[MXN], h[MXN], stt[MXN], fnt[MXN], timer; void dfs(int v) { jp[v] = h[jp[jp[par[v]]]] - h[jp[par[v]]] == h[jp[par[v]]] - h[par[v]] ? jp[jp[par[v]]] : par[v]; stt[v] = timer++; for(int u : g[v]) if(u!=par[v]) par[u] = v, h[u] = h[v]+1, dfs(u); fnt[v] = timer; } inline int jump(int v, int d) { if(d==h[v]) return v; while(h[par[v]]>d) v = h[jp[v]]>d ? jp[v] : par[v]; return par[v]; } inline int LCA(int u, int v) { if(h[u]<h[v]) swap(u, v); u = jump(u, h[v]); if(u==v) return u; while(par[u]!=par[v]) if(jp[u]==jp[v]) u=par[u], v=par[v]; else u=jp[u], v=jp[v]; return par[u]; } inline void upd(int v, ll x) { f0.upd(stt[v], fnt[v], x); f1.upd(stt[v], fnt[v], 1); } inline pair<ll, int> get(int u, int v) { int lca = LCA(u, v); return { f0.get(stt[u]) + f0.get(stt[v]) - 2*f0.get(stt[lca]), f1.get(stt[u]) + f1.get(stt[v]) - 2*f1.get(stt[lca]) }; } inline void clear() { memset(f0.fen, 0, sizeof(f0.fen)); memset(f1.fen, 0, sizeof(f1.fen)); } int m, q, P[MXN], C[MXN], sq[MXN], tq[MXN], xq[MXN], yq[MXN], L[MXN], R[MXN], ans[MXN], ord[MXN]; vector<int> vec[MXN]; int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> m >> q; for(int i=1; i<=n-1; i++) { cin >> A[i] >> B[i]; g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } par[0] = 0; dfs(1); clear(); for(int i=1; i<=m; i++) { cin >> P[i] >> C[i]; P[i] = A[P[i]]==par[B[P[i]]] ? B[P[i]] : A[P[i]]; ord[i] = i; upd(P[i], 0); } sort(ord+1, ord+m+1, [&](int i, int j) { return C[i] < C[j]; }); for(int i=1; i<=q; i++) { cin >> sq[i] >> tq[i] >> xq[i] >> yq[i]; L[i] = 0, R[i] = m+1; ans[i] = get(sq[i], tq[i]).Y; } while(1) { clear(); for(int i=1; i<=m; i++) vec[i].clear(); bool fnd = 0; for(int i=1; i<=q; i++) if(R[i]-L[i]>1) { fnd = 1; vec[(L[i]+R[i])>>1].push_back(i); } if(!fnd) break; for(int i=1; i<=m; i++) { upd(P[ord[i]], C[ord[i]]); for(int j : vec[i]) (get(sq[j], tq[j]).X<=yq[j] ? L[j] : R[j]) = i; } } clear(); for(int i=1; i<=m; i++) vec[i].clear(); for(int i=1; i<=q; i++) vec[L[i]].push_back(i); for(int i=0; i<=m; i++) { if(i) upd(P[ord[i]], 0); for(int j : vec[i]) { int cnt = get(sq[j], tq[j]).Y; ans[j] = max(-1, xq[j] - (ans[j]-cnt)); } } for(int i=1; i<=q; i++) cout << ans[i] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...