Advertisement
Morass

Motoku2

Jul 26th, 2017
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF int(1e9+1)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef pair<ll,ll> pll;
  12. typedef vector<int> vi;
  13. typedef pair<int,int> ii;
  14. typedef vector<pll> vii;
  15. #define IN(n) int n;scanf("%d",&n);
  16. #define FOR(i, m, n) for (int i(m); i < n; i++)
  17. #define F(n) FOR(i,0,n)
  18. #define FF(n) FOR(j,0,n)
  19. #define FT(m, n) FOR(k, m, n)
  20. #define aa first
  21. #define bb second
  22. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  23. #define MX (300666)
  24. vi g[MX];
  25. int W[MX];
  26. void foo(int);
  27. int dfs(int u,int p){
  28.     W[u]=1;
  29.     for(auto&h:g[u])if(h^p)W[u]+=dfs(h,u);
  30.     return W[u];
  31. }
  32. int rot(int u,int S){
  33.     for(auto&h:g[u])if(W[h]>S-W[h]&&W[h]<W[u])return rot(h,S);
  34.     return u;
  35. }
  36. void cdc(int r=0){
  37.     int S=dfs(r,-1),R=rot(r,S);
  38.     foo(R);
  39.     for(auto&h:g[R]){
  40.         for(auto&w:g[h])if(w==R)w=g[h].back();
  41.         g[h].pop_back();
  42.         cdc(h);
  43.         g[h].PB(R);
  44.     }
  45. }
  46. #define ADD(A,B) (g[A].PB(B),g[B].PB(A))
  47. int N,A[MX],a,b,l;
  48. ll O[MX],S[MX],s[MX],z[MX],Z[MX];
  49. vii Q[MX];
  50. void add(int d,ll T,int m){
  51.     if(S[d]>T){
  52.         if(Z[d]==m)S[d]=T;
  53.         else z[d]=Z[d],s[d]=S[d],S[d]=T,Z[d]=m;
  54.     }else if(Z[d]==m)return;
  55.     else if(s[d]>T)s[d]=T,z[d]=m;
  56. }
  57. ll dis(int d,int m){
  58.     return Z[d]^m?S[d]:s[d];
  59. }
  60. void pud(int u,int d,ll T,int p,int m,int&l){
  61.     T+=A[u],l=max(l,d),add(d,T,m);
  62.     for(auto&h:g[u])if(h^p)pud(h,d+1,T,u,m,l);
  63. }
  64. void bst(int u,int d,ll T,int p,int m){
  65.     T+=A[u];
  66.     for(auto&h:Q[u])if(h.aa>=d)O[h.bb]=min(O[h.bb],T+dis(h.aa-d,m));
  67.     for(auto&h:g[u])if(h^p)bst(h,d+1,T,u,m);
  68. }
  69. void foo(int r){
  70.     l=0,*S=0,*Z=-1;
  71.     F((int)g[r].size())pud(g[r][i],1,0,r,i,l);
  72.     ++l;
  73.     F((int)g[r].size())bst(g[r][i],1,A[r],r,i);
  74.     for(auto&h:Q[r])O[h.bb]=min(O[h.bb],A[r]+dis(h.aa,-2));
  75.     F(l)S[i]=s[i]=z[i]=Z[i]=1e17;
  76. }
  77. int main(void){
  78.     scanf("%d",&N),ga(N,A),fill(O,O+MX,1e18);
  79.     F(MX)S[i]=s[i]=z[i]=Z[i]=1e17;
  80.     F(N-1)scanf("%d%d",&a,&b),--a,--b,ADD(a,b);
  81.     IN(_)F(_)scanf("%d%d",&a,&b),Q[--a].PB({b,i});
  82.     cdc();
  83.     F(_)printf("%lld\n",O[i]<1e15?O[i]:-1);
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement