Submission #1366684

#TimeUsernameProblemLanguageResultExecution timeMemory
1366684haught_veathTwo Currencies (JOI23_currencies)C++20
100 / 100
634 ms59760 KiB
#include <bits/stdc++.h>
#define int long long
#define loop(i,l,r,s) for(int i = l;i <= r;i+=s)
#define rloop(i,l,r,s) for(int i = r;i >= l;i-=s)
#define fastio ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0)
#define fileinp(name) freopen(name".inp","r",stdin)
#define fileout(name) freopen(name".out","w",stdout)
#define all(x) x.begin(),x.end()
#define hv signed main()
#define ins push_back
using namespace std;
const int maxn = 2e5+5;
const int rd = chrono::steady_clock::now().time_since_epoch().count();
template <typename T>
using v = vector<T>;
struct fenwick{
  int bit[maxn],n;
  fenwick(int N){
    n = N;
    loop(i,0,n,1)bit[i] = 0;
  }
  void update(int pos,int val){
    while(pos <= n){
      bit[pos] += val;
      pos += pos&-pos;
    }
  }
  int query(int pos){
    int ans = 0;
    while(pos > 0){
      ans += bit[pos];
      pos -= pos&-pos;
    }
    return ans;
  }
  int query(int r,int l){
    return query(r) - query(l);
  }
};
int tin[maxn],tout[maxn],timer = 0,q,n,m;
int jump[21][maxn],depth[maxn];
v<pair<int,int>> a;
v<tuple<int,int,int,int,int>> queries;
v<int> adj[maxn],mid[maxn];
void tour(int u,int p){
  tin[u] = ++timer;
  jump[0][u] = p;
  depth[u] = depth[p]+1;
  for(int v : adj[u]){
    if(v == p)continue;
    tour(v,u);
  }
  tout[u] = timer;
}
void build(){
  for(int i = 1;i < 21;i++)
    loop(j,1,n,1)jump[i][j] = jump[i-1][jump[i-1][j]];
}
int lca(int u,int v){
  if(depth[u] > depth[v]) swap(u,v);
  int dist = depth[v] - depth[u];
  for(int i=20;i>=0;i--)
      if(dist&(1LL<<i)) v = jump[i][v];
  if(u==v) return u;
  for(int i=20;i>=0;i--){
    if(jump[i][u] != jump[i][v]){
      u = jump[i][u];
      v = jump[i][v];
    }
  }
  return jump[0][u];
}
int l[maxn],r[maxn],ans[maxn];
void solve(){
  loop(i,0,q-1,1)l[i] = 0,r[i] = (int)a.size(),ans[i] = -1;
  while(true){
    bool stop = true;
    loop(i,0,q-1,1){
      if(l[i] > r[i])continue;
      stop = false;
      mid[(l[i]+r[i])/2].ins(i);
    }
    if(stop)break;
    fenwick ctree(n),vtree(n);
    
    loop(i,0,(int)a.size()-1,1){
      ctree.update(tin[a[i].second],1);
      ctree.update(tout[a[i].second]+1,-1);
    }
    loop(i,0,(int)a.size(),1){
      for(int j : mid[i]){
        auto [u,v,gold,bac,p] = queries[j];
        int sum = vtree.query(tin[u],tin[p])+vtree.query(tin[v],tin[p]);
        int cnt = ctree.query(tin[u],tin[p])+ctree.query(tin[v],tin[p]);
        if(sum <= bac){
          l[j] = i+1;
          ans[j] = cnt;
        }else r[j] = i-1;
      }
      mid[i].clear();
      if(i == (int)a.size())continue;
      ctree.update(tin[a[i].second],-1);
      ctree.update(tout[a[i].second]+1,1);
      vtree.update(tin[a[i].second],a[i].first);
      vtree.update(tout[a[i].second]+1,-a[i].first);
    }
  }
  loop(i,0,q-1,1){
    auto [u,v,gold,bac,p] = queries[i];
    cout << max(gold - ans[i],-1LL) << "\n";
  }
}
hv{
  fastio;
  cin >> n  >> m >> q;
  v<pair<int,int>> edge;
  loop(i,2,n,1){
    int u,v;
    cin >> u >> v;
    adj[u].ins(v);
    adj[v].ins(u);
    edge.emplace_back(u,v);
  }
  tour(1,0);
  build();
  loop(i,1,m,1){
    int p,c;
    cin >> p >> c;
    auto [u,v] = edge[p-1];
    if(depth[u] < depth[v])swap(u,v);
    a.emplace_back(c,u);
  }
  sort(all(a));
  loop(i,1,q,1){
    int s,t,v,b;
    cin >> s >> t >> v >> b;
    queries.emplace_back(s,t,v,b,lca(s,t));
  }
  solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...