Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
- #define ll long long
- #define sz(s) (int)(s).size()
- #define all(s) (s).begin(),(s).end()
- using namespace std;
- void File();
- void sol();
- int main() {
- boAshraf
- // File();
- freopen("tree.in", "r", stdin);
- int t = 1;
- cin >> t;
- while (t--) {
- sol();
- }
- return 0;
- }
- void sol() {
- int n,q;
- cin>>n>>q;
- vector<ll>sum(n+1),val(n+1);
- vector<int>in(n+1),out(n+1),depth(n+1);
- for(int i=1;i<=n;i++)cin>>val[i];
- vector<vector<int>>level(n + 2);
- int timer=0;
- vector<vector<int>>adj(n+1);
- for(int i=1;i<n;i++){
- int u,v;
- cin>>u>>v;
- adj[u].emplace_back(v);
- adj[v].emplace_back(u);
- }
- auto dfs=[&](auto &self,int u,int p,int d)->void{
- sum[u]=val[u];
- in[u]=++timer;
- level[d].emplace_back(u);
- depth[u]=d;
- for(auto v:adj[u]){
- if(v==p)continue;
- self(self,v,u,d+1);
- sum[u]+=sum[v];
- }
- out[u]=timer;
- };
- dfs(dfs,1,-1,0);
- vector<vector<ll>>pre(n+1);
- for(int i=0;i<n;i++){
- if(level[i].empty())break;
- pre[i]=vector<ll>(sz(level[i]));
- for(int j=0;j<sz(pre[i]);j++){
- pre[i][j]= sum[level[i][j]] + (j ? pre[i][j - 1] : 0);
- }
- }
- auto calc=[&](int d,int l,int r)->ll{
- if(l==-1 || r==-1)return 0;
- return pre[d][r]-(l?pre[d][l-1]:0);
- };
- while(q--){
- int u,d;
- cin>>u>>d;
- ll ans=sum[u];
- d+=depth[u]+1;
- if(d<=n) {
- int st = -1, ed = -1;
- int l = 0, r = sz(level[d]) - 1;
- while (l <= r) {
- int mid = (l + r) / 2;
- int v = level[d][mid];
- if (in[v] >= in[u] && out[v] <= out[u]) {
- st = mid, r = mid - 1;
- } else if (in[v] < in[u])l = mid + 1;
- else r = mid - 1;
- }
- l = 0, r = sz(level[d]) - 1;
- while (l <= r) {
- int mid = (l + r) / 2;
- int v = level[d][mid];
- if (in[v] >= in[u] && out[v] <= out[u]) {
- ed = mid, l = mid + 1;
- } else if (in[v] < in[u])l = mid + 1;
- else r = mid - 1;
- }
- ans -= calc(d, st, ed);
- }
- cout<<ans<<'\n';
- }
- }
- void File() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment