int main() { int n, q; geti(n, q); for(int i = 1; i < n; i++) { int u, v; geti(u, v); u--; v--; adj[u].pb(v); adj[v].pb(u); } init(n); dfs(0, -1); HLD(0, -1); while(q--) { int type, x; geti(type, x); x--; if(type == 0) { updateTree(x); } else { printf("%d\n", queryTree(x)); } } }
void HLD(int cur,int c,int prev) { if(chainHead[chainNo] == -1) chainHead[chainNo] = cur; // init chainHead of chainNo. ptr++; chainIdx[cur] = chainNo; //chainNo. of this node posInBase[cur] = ptr; // Position of this node in baseArray baseArray[ptr] = c; // put edge cost in baseArray of SegTree int sc = -1,ncost; for(int i=0;i<adj[cur].size();i++) { if(adj[cur][i] != prev)//dont compare with parent { if(sc == -1 || subsize[sc] < subsize[adj[cur][i]]) { sc = adj[cur][i]; // max subsize child ncost = cost[cur][i]; } } } if(sc != -1) // not leaf node HLD(sc,ncost,cur); for(int i=0;i<adj[cur].size();i++) { if(adj[cur][i] != prev) { if(sc != adj[cur][i]) //all normal child { //new chain for normal child chainNo++; HLD(adj[cur][i],cost[cur][i],cur); } } } }
void HLD(int x, int p) { if(head[cnt] == -1) head[cnt] = x; idx[x] = cnt; pos[x] = sz; rev[sz] = x; sz++; int cindex = -1; for(int i = 0; i < adj[x].size(); i++) { if(adj[x][i] != p) if(cindex == -1 || sub[adj[x][cindex]] < sub[adj[x][i]]) cindex = i; } if(cindex != -1) HLD(adj[x][cindex], x); for(int i = 0; i < adj[x].size(); i++) { if(adj[x][i] != p && i != cindex) { cnt++; HLD(adj[x][i], x); } } }