Loi_Vampire's Blog

自己选择的路,就算跪着也要走完

12/24
16:31
主席树 数据结构

BZOJ 2588 Spoj 10628. Count on a tree 主席树|倍增lca

Description

给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。

Input

第一行两个整数N,M。 第二行有N个整数,其中第i个整数表示点i的权值。 后面N-1行每行两个整数(x,y),表示点x到点y有一条边。 最后M行每行两个整数(u,v,k),表示一组询问。

Output

M行,表示每个询问的答案。

Sample Input

8 5
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
2 5 1
0 5 2
10 5 3
11 5 4
110 8 2

Sample Output

2
8
9
105
7

HINT

HINT:
N,M<=100000 暴力自重。。。

Source

鸣谢seter

树上建主席树就好了呀。每次查询,先倍增求lca, 然后根据 tree[tree[x].l].cnt + tree[tree[y].l].cnt - tree[tree[z].l].cnt - tree[tree[F].l].cnt 决定往左边还是往右边走。

x y 是给定的两点 z是lca F是fa[lca]

犯了一些sb错误,比如 求jump数组的时候放到了dfs外面……