Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. /*
  2. ID      :
  3. NAME    :
  4. CODER   : Arman Kamal
  5. TYPE    :
  6. */
  7.  
  8. #include <algorithm>
  9. #include <cctype>
  10. #include <cmath>
  11. #include <cstdio>
  12. #include <cstdlib>
  13. #include <cstring>
  14. #include <climits>
  15. #include <iostream>
  16. #include <map>
  17. #include <queue>
  18. #include <set>
  19. #include <sstream>
  20. #include <stack>
  21. #include <string>
  22. #include <vector>
  23.  
  24. # define FOR(i, a, b) for (int i=a; i<b; i++)
  25. # define REP(i, a) FOR(i,0,a)
  26.  
  27. #define EPS 1e-9
  28. #define inf ( 1LL << 30 )
  29. #define LL long long
  30.  
  31. #define abs(x) (((x)< 0) ? (-(x)) : (x))
  32. #define all(x) (x).begin(), (x).end()
  33. #define ms(x, a) memset((x), (a), sizeof(x))
  34.  
  35. # define VI vector<int>
  36. # define VS vector<string>
  37. # define VC vector<char>
  38. # define pii pair<int,int>
  39.  
  40. #define mp make_pair
  41. #define pb push_back
  42. #define CI(x) scanf(" %d", &x)
  43. #define CL(x) scanf(" %lld", &x)
  44. #define READ(x) freopen(x,"r",stdin)
  45. #define WRITE(x) freopen(x, "w",stdout)
  46.  
  47. using namespace std;
  48.  
  49. #define PI 2*acos(0.0)
  50.  
  51. #define MAX 30005
  52.  
  53.  
  54. int a[MAX] ;
  55.  
  56. LL bit[MAX] ;
  57.  
  58. void update(int i , LL v){
  59.     while(i < MAX){
  60.         bit[i] += v ;
  61.         i += (i & -i) ;
  62.     }
  63. }
  64.  
  65. LL query(int i){
  66.     LL sum = 0 ;
  67.     while(i > 0){
  68.         sum += bit[i] ;
  69.         i -= (i & -i) ;
  70.     }
  71.     return sum ;
  72. }
  73.  
  74. LL read(int u , int v){
  75.     LL res = 0 ;
  76.     res = query(v) ;
  77.     res -= query(u - 1) ;
  78.     return res ;
  79. }
  80.  
  81.  
  82.  
  83.  
  84. #define MAXN 30005
  85.  
  86. int n , m , vid = 1 ;
  87. int lvl[MAXN] , parent[MAXN] , child[MAXN] , chain[MAXN] ;
  88. int vis[MAXN] ;
  89.  
  90. vector <int> G[MAXN] ;
  91.  
  92.  
  93. int dfs(int u , int p){
  94.     parent[u] = p ;
  95.     int tot = 1 , tmp = 0 , sz = G[u].size() , v;
  96.  
  97.     REP(i , sz){
  98.         v = G[u][i] ;
  99.         if(v == p)continue ;
  100.         lvl[v] = lvl[u] + 1 ;
  101.         tmp = dfs(v , u) ;
  102.         tot += tmp ;
  103.     }
  104.     child[u] = tot ;
  105.     return tot ;
  106. }
  107.  
  108.  
  109. void hld(int u , int p , int col){
  110.     vis[u] = vid++ ;
  111.     chain[u] = col ;
  112.     int idx = -1 , v ;
  113.     int sz = G[u].size() ;
  114.     REP(i , sz){
  115.         v =  G[u][i] ;
  116.         if(v == p)continue ;
  117.         if(idx == -1 or child[v] > child[idx]){
  118.             idx = v ;
  119.         }
  120.     }
  121.     if(idx != -1){
  122.         hld(idx , u , col) ;
  123.     }
  124.  
  125.  
  126.     REP(i , sz){
  127.         v =  G[u][i] ;
  128.         if(v == p)continue ;
  129.         if(v == idx)continue ;
  130.         hld(v , u , v) ;
  131.        // cerr << u << " " << v << endl ;
  132.     }
  133.  
  134.     return ;
  135.  
  136. }
  137.  
  138. LL lca(int a , int b){
  139.     LL res = 0 ;
  140.     int x = 0 , y = 0 ;
  141.     while(chain[a] != chain[b]){
  142.         if(lvl[ chain[a] ] < lvl[ chain[b] ]){
  143.            swap(a , b) ;
  144.         }
  145.         x  = vis[a] , y = vis[ chain[a] ] ;
  146.         if(x > y)swap(x , y) ;
  147.         res += read(x , y) ;
  148.  
  149.  
  150.  
  151.         a = parent[ chain[a] ] ;
  152.     }
  153.  
  154.     if(lvl[a] > lvl[b]){
  155.         swap(a , b) ;
  156.     }
  157.  
  158.     x = vis[a] , y = vis[b];
  159.     if(x > y)swap(x , y) ;
  160.     res += read(x , y) ;
  161.     return res ;
  162. }
  163.  
  164.  
  165. void reset(){
  166.     ms(bit , 0) ;
  167.     vid = 1 ;
  168. }
  169.  
  170. int main(){
  171.     #if defined(ArK)
  172.         READ("in.txt") ;
  173.     #endif
  174.  
  175.     LL res ;
  176.     int t , cas = 0 , u , v, q, ty;
  177.     scanf(" %d", &t) ;
  178.     while(t--){
  179.         reset() ;
  180.         scanf(" %d", &n) ;
  181.         REP(i , n){
  182.             scanf(" %d", &a[i]) ;
  183.             //G[i].clear() ;
  184.         }
  185.  
  186.         REP(i, n+4)G[i].clear() ;
  187.  
  188.         REP(i , n-1){
  189.             scanf(" %d %d", &u , &v) ;
  190.             G[u].pb(v) ;
  191.             G[v].pb(u) ;
  192.         }
  193.  
  194.         vid = 1 ;
  195.         dfs(0 , -1) ;
  196.         hld(0 , -1 , 0) ;
  197.  
  198.  
  199.         REP(i , n){
  200.             update( vis[i], a[i] ) ;
  201.  
  202.         }
  203.  
  204.  
  205.         printf("Case %d:\n", ++cas) ;
  206.         scanf(" %d", &q) ;
  207.         REP(_ , q){
  208.             scanf(" %d %d %d", &ty , &u , &v) ;
  209.  
  210.             if(ty){
  211.                 update(vis[u], -read(vis[u],vis[u]) + v) ;
  212.             }else{
  213.  
  214.                 res = lca(u , v) ;
  215.                 printf("%lld\n", res) ;
  216.             }
  217.         }
  218.  
  219.  
  220.     }
  221.  
  222.  
  223.     return 0;
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement