#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;
}
ft[u] = timer;
}
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(id[u] != id[v]){
if(id[u] > id[v]){
u = par[head[id[u]]];
}
else{
v = par[head[id[v]]];
}
}
if(d[u] < d[v]) return u;
return 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){
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];
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] = 1, 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 = 1; i <= m; i++){
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]);
if(w <= y){
int nanase = get(1, st[s]) + get(1, st[t]) - 2 * get(1, st[p]);
if(nanase <= x) ans[id] = min(ans[id], x - nanase);
l[id] = i + 1;
}
else{
r[id] = i - 1;
}
}
}
}
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |