【bzoj2588】Spoj 10628. Count on a tree

2014年6月17日4,0816

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
暴力自重。。。

题解

在树上建主席树,然后就很简单了。。。

 

  • 魏子豪2016年4月27日 下午1:16 回复

    为什么这个建立主席树还要重新打树上编号?

    #1  
    • 黄学长的脑残粉2016年4月27日 下午1:52 回复

      重标号之后一个链上的点才是连续的啊?

      #11
      • 魏子豪2016年4月27日 下午2:04 回复

        觉得直接在父亲那颗树上直接建树就可以了啊

        #12
        • 魏子豪2016年4月27日 下午5:12 回复

          在倍增预处理的同时就同时在父亲节点的基础上建树

          #13
          • invoid2016年7月11日 下午6:57

            您最后写成功了么,我也有这样的疑问

            #14
          • 魏子豪2016年12月27日 下午1:34

            写成功了,可以不用重新打标记。

            #14