Exemplo n.º 1
0
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);
                }
            }
        }
    }
Exemplo n.º 3
0
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);
        }
    }
}