Advertisement
Morass

ADASALES - Batman

Oct 4th, 2017
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int p[100004];
  5. vector<vector<int>>g;
  6. vector<int>dv;
  7. bitset<100004>vis;
  8. set<pair<ll,int>>s[100004];
  9. ll ans[100004];
  10. void dfs(int x){
  11.     vis[x]=1;
  12.     dv.push_back(x);
  13.     for(int u:g[x])if(!vis[u]){
  14.         dfs(u);
  15.         if(s[u].size()){
  16.             s[x].insert({s[u].rbegin()->first+max(p[u]-p[x],0),u});
  17.             if(s[x].size()>2)s[x].erase(s[x].begin());
  18.         }
  19.         else if(p[u]-p[x]>0){
  20.             s[x].insert({p[u]-p[x],u});
  21.             if(s[x].size()>2)s[x].erase(s[x].begin());
  22.         }
  23.     }
  24. }
  25. int main(){
  26.     ios_base::sync_with_stdio(0);
  27.     int n,q,i,x,y;
  28.     set<pair<ll,int>>::reverse_iterator it,eit;
  29.     cin>>n>>q;
  30.     for(i=0;i<n;++i)cin>>p[i];
  31.     g.assign(n,dv);
  32.     for(i=1;i<n;++i){
  33.         cin>>x>>y;
  34.         g[x].push_back(y);
  35.         g[y].push_back(x);
  36.     }
  37.     dfs(0);
  38.     if(s[0].empty())s[0].insert({0,0});
  39.     for(i=1;i<n;++i){
  40.         x=dv[i];
  41.         for(int u:g[x]){
  42.             eit=s[u].rend();
  43.             for(it=s[u].rbegin();it!=eit;++it)if(it->second!=x&&it->first+max(p[u]-p[x],0)){
  44.                 s[x].insert({it->first+max(p[u]-p[x],0),u});
  45.                 if(s[x].size()>2)s[x].erase(s[x].begin());
  46.                 break;
  47.             }
  48.             if(it==eit&&p[u]-p[x]>0){
  49.                 s[x].insert({p[u]-p[x],u});
  50.                 if(s[x].size()>2)s[x].erase(s[x].begin());
  51.             }
  52.         }
  53.         if(s[x].empty())s[x].insert({0,x});
  54.     }
  55.     for(i=0;i<n;++i)ans[i]=s[i].rbegin()->first;
  56.     while(q--){
  57.         cin>>x;
  58.         cout<<ans[x]<<'\n';
  59.     }
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement