Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ID :
- NAME :
- CODER : Arman Kamal
- TYPE :
- */
- #include <algorithm>
- #include <cctype>
- #include <cmath>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <climits>
- #include <iostream>
- #include <map>
- #include <queue>
- #include <set>
- #include <sstream>
- #include <stack>
- #include <string>
- #include <vector>
- # define FOR(i, a, b) for (int i=a; i<b; i++)
- # define REP(i, a) FOR(i,0,a)
- #define EPS 1e-9
- #define inf ( 1LL << 30 )
- #define LL long long
- #define abs(x) (((x)< 0) ? (-(x)) : (x))
- #define all(x) (x).begin(), (x).end()
- #define ms(x, a) memset((x), (a), sizeof(x))
- # define VI vector<int>
- # define VS vector<string>
- # define VC vector<char>
- # define pii pair<int,int>
- #define mp make_pair
- #define pb push_back
- #define CI(x) scanf(" %d", &x)
- #define CL(x) scanf(" %lld", &x)
- #define READ(x) freopen(x,"r",stdin)
- #define WRITE(x) freopen(x, "w",stdout)
- using namespace std;
- #define PI 2*acos(0.0)
- #define MAX 30005
- int a[MAX] ;
- LL bit[MAX] ;
- void update(int i , LL v){
- while(i < MAX){
- bit[i] += v ;
- i += (i & -i) ;
- }
- }
- LL query(int i){
- LL sum = 0 ;
- while(i > 0){
- sum += bit[i] ;
- i -= (i & -i) ;
- }
- return sum ;
- }
- LL read(int u , int v){
- LL res = 0 ;
- res = query(v) ;
- res -= query(u - 1) ;
- return res ;
- }
- #define MAXN 30005
- int n , m , vid = 1 ;
- int lvl[MAXN] , parent[MAXN] , child[MAXN] , chain[MAXN] ;
- int vis[MAXN] ;
- vector <int> G[MAXN] ;
- int dfs(int u , int p){
- parent[u] = p ;
- int tot = 1 , tmp = 0 , sz = G[u].size() , v;
- REP(i , sz){
- v = G[u][i] ;
- if(v == p)continue ;
- lvl[v] = lvl[u] + 1 ;
- tmp = dfs(v , u) ;
- tot += tmp ;
- }
- child[u] = tot ;
- return tot ;
- }
- void hld(int u , int p , int col){
- vis[u] = vid++ ;
- chain[u] = col ;
- int idx = -1 , v ;
- int sz = G[u].size() ;
- REP(i , sz){
- v = G[u][i] ;
- if(v == p)continue ;
- if(idx == -1 or child[v] > child[idx]){
- idx = v ;
- }
- }
- if(idx != -1){
- hld(idx , u , col) ;
- }
- REP(i , sz){
- v = G[u][i] ;
- if(v == p)continue ;
- if(v == idx)continue ;
- hld(v , u , v) ;
- // cerr << u << " " << v << endl ;
- }
- return ;
- }
- LL lca(int a , int b){
- LL res = 0 ;
- int x = 0 , y = 0 ;
- while(chain[a] != chain[b]){
- if(lvl[ chain[a] ] < lvl[ chain[b] ]){
- swap(a , b) ;
- }
- x = vis[a] , y = vis[ chain[a] ] ;
- if(x > y)swap(x , y) ;
- res += read(x , y) ;
- a = parent[ chain[a] ] ;
- }
- if(lvl[a] > lvl[b]){
- swap(a , b) ;
- }
- x = vis[a] , y = vis[b];
- if(x > y)swap(x , y) ;
- res += read(x , y) ;
- return res ;
- }
- void reset(){
- ms(bit , 0) ;
- vid = 1 ;
- }
- int main(){
- #if defined(ArK)
- READ("in.txt") ;
- #endif
- LL res ;
- int t , cas = 0 , u , v, q, ty;
- scanf(" %d", &t) ;
- while(t--){
- reset() ;
- scanf(" %d", &n) ;
- REP(i , n){
- scanf(" %d", &a[i]) ;
- //G[i].clear() ;
- }
- REP(i, n+4)G[i].clear() ;
- REP(i , n-1){
- scanf(" %d %d", &u , &v) ;
- G[u].pb(v) ;
- G[v].pb(u) ;
- }
- vid = 1 ;
- dfs(0 , -1) ;
- hld(0 , -1 , 0) ;
- REP(i , n){
- update( vis[i], a[i] ) ;
- }
- printf("Case %d:\n", ++cas) ;
- scanf(" %d", &q) ;
- REP(_ , q){
- scanf(" %d %d %d", &ty , &u , &v) ;
- if(ty){
- update(vis[u], -read(vis[u],vis[u]) + v) ;
- }else{
- res = lca(u , v) ;
- printf("%lld\n", res) ;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement