AhmedAshraff

Untitled

Jun 13th, 2025
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
  4. #define ll long long
  5. #define sz(s) (int)(s).size()
  6. #define all(s) (s).begin(),(s).end()
  7. using namespace std;
  8.  
  9. void File();
  10.  
  11. void sol();
  12. int main() {
  13.     boAshraf
  14. //    File();
  15.     freopen("tree.in", "r", stdin);
  16.     int t = 1;
  17.     cin >> t;
  18.     while (t--) {
  19.         sol();
  20.     }
  21.     return 0;
  22. }
  23.  
  24. void sol() {
  25.     int n,q;
  26.     cin>>n>>q;
  27.     vector<ll>sum(n+1),val(n+1);
  28.     vector<int>in(n+1),out(n+1),depth(n+1);
  29.     for(int i=1;i<=n;i++)cin>>val[i];
  30.     vector<vector<int>>level(n + 2);
  31.  
  32.     int timer=0;
  33.     vector<vector<int>>adj(n+1);
  34.     for(int i=1;i<n;i++){
  35.         int u,v;
  36.         cin>>u>>v;
  37.         adj[u].emplace_back(v);
  38.         adj[v].emplace_back(u);
  39.     }
  40.     auto dfs=[&](auto &self,int u,int p,int d)->void{
  41.         sum[u]=val[u];
  42.         in[u]=++timer;
  43.         level[d].emplace_back(u);
  44.         depth[u]=d;
  45.         for(auto v:adj[u]){
  46.             if(v==p)continue;
  47.             self(self,v,u,d+1);
  48.             sum[u]+=sum[v];
  49.         }
  50.         out[u]=timer;
  51.     };
  52.     dfs(dfs,1,-1,0);
  53.     vector<vector<ll>>pre(n+1);
  54.     for(int i=0;i<n;i++){
  55.         if(level[i].empty())break;
  56.         pre[i]=vector<ll>(sz(level[i]));
  57.         for(int j=0;j<sz(pre[i]);j++){
  58.             pre[i][j]= sum[level[i][j]] + (j ? pre[i][j - 1] : 0);
  59.         }
  60.     }
  61.     auto calc=[&](int d,int l,int r)->ll{
  62.         if(l==-1 || r==-1)return 0;
  63.         return pre[d][r]-(l?pre[d][l-1]:0);
  64.     };
  65.     while(q--){
  66.         int u,d;
  67.         cin>>u>>d;
  68.         ll ans=sum[u];
  69.         d+=depth[u]+1;
  70.         if(d<=n) {
  71.             int st = -1, ed = -1;
  72.             int l = 0, r = sz(level[d]) - 1;
  73.             while (l <= r) {
  74.                 int mid = (l + r) / 2;
  75.                 int v = level[d][mid];
  76.                 if (in[v] >= in[u] && out[v] <= out[u]) {
  77.                     st = mid, r = mid - 1;
  78.                 } else if (in[v] < in[u])l = mid + 1;
  79.                 else r = mid - 1;
  80.             }
  81.             l = 0, r = sz(level[d]) - 1;
  82.             while (l <= r) {
  83.                 int mid = (l + r) / 2;
  84.                 int v = level[d][mid];
  85.                 if (in[v] >= in[u] && out[v] <= out[u]) {
  86.                     ed = mid, l = mid + 1;
  87.                 } else if (in[v] < in[u])l = mid + 1;
  88.                 else r = mid - 1;
  89.             }
  90.             ans -= calc(d, st, ed);
  91.         }
  92.         cout<<ans<<'\n';
  93.     }
  94. }
  95.  
  96. void File() {
  97. #ifndef ONLINE_JUDGE
  98.     freopen("input.txt", "r", stdin);
  99.     freopen("output.txt", "w", stdout);
  100. #endif
  101. }
Advertisement
Add Comment
Please, Sign In to add comment