苹果树
题号:NC202500
时间限制:C/C++/Rust/Pascal 4秒,其他语言8秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

       给定一个由n个点和n-1条边组成的无向连通图(即一棵树),每一条边都有一个权值代表走过它所需要的时间花费,每个点上面有初始有一个苹果,每个苹果有一个成熟度。

       由于苹果不熟或者熟的太透了都不会好吃,所以现在米咔想摘一个成熟度在范围[x,y]的苹果来做苹果派。现在需要你来执行m条操作。

       1 u x:在某一个点u新出现了一个成熟度为x的苹果。(1≤u≤n,1≤x≤10000)

       2 u x y:询问米咔从某一个点u出发,去摘一个成熟度在[xy]范围内的苹果并回到u的最小时间花费。(1≤u≤n,1≤x≤y≤10000)

输入描述:

第一行两个正整数n,m(1 ≤ n,m ≤100000)

第二行n个正整数,代表每个点苹果的成熟度。
接下来n-1行每行三个正整数u,v,w,表示u,w间的边权是w。保证给出的图是一棵树。

接下来m行每行一个操作,格式见题目描述。

保证苹果的成熟度和边权都不大于10000。

输出描述:

对于每个询问,输出对应答案。如果无法完成,输出-1。
示例1

输入

复制
3 3
1 5 10
1 2 1
2 3 2
2 2 10 10
1 1 10
2 2 10 10

输出

复制
4
2

说明

第一次询问最优是从点2去点3摘成熟度为10的苹果再回到点2,时间花费为4。
第二次询问最优是从点2去点1摘成熟度为10的苹果再回到点2,时间花费为2。