题目
Time Limits: 3000 ms Memory Limits: 524288 KB
Description
Pulumi生活在P城的角落,而他的朋友们gjdy,oyski,tutuwai等等生活在P城的靠中心位置。
P城很大,但它拥有优秀的城市结构,同时P城重视文化教育的发展,P城共有n个学校,校与校之间共建立了n-1条交通线路,且两所学校之间存在唯一的连通路径。
P城常常举行各种类型的评比活动,为了节约资金,最终将给某一条路径上的所有学校颁发证书。为了便于描述我们记一次评比活动的结果为(ui,vi,zi)表示路径(ui,vi)上的所有学校获得一个类型为zi的证书。
一个学校若为Zmax类型的学校,则表示它在Zmax类型下的证书数量最多(如果有相同数量的类型,取类型标号最小一个)。
Pulumi收集了本年度所有的评比活动结果,共m次。他很感兴趣所有学校的类型,以了解他朋友们学校的状况,现在他忙于出题,把这个任务交给了你。
Input
第一行,两个整数n,m,如题中所述。
下接n-1行,每行两个整数u,v,表示标号u和v的学校之间有一条直接相连的路。
下接m行,每行三个整数u,v,z,表示一次结果为(u,v,z)的评比活动。
Output
共n行,第i行,一个整数zi,表示标号为i的学校类型为zi。
Sample Input
5 3
1 2
3 1
3 4
5 3
2 3 3
1 5 2
3 3 3
Sample Output
2
3
3
0
2
Data Constraint
对于30%的数据1<=N<=1000,1<=M<=1000
另外在30%的数据满足i-1与i之间有一条直接相连的路
对于100%的数据1<=N<=100000,0<=M<=100000,1<=zi<=10^9
题解
如果用线段树合并的话是一道十分裸的题目,只要在两个儿子+1,lca及其父亲-1即可
主要是没有打过线段树合并
其实直接强行合并就好了,不需要启发式
贴代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fo1(i,b,a) for(i=b;i>=a;i--)
using namespace std;
const int maxn=1e5+5;
struct P{
int x,y,z;
}a[maxn];
int tree[maxn*30][5];
int fi[maxn],ne[maxn*2],dui[maxn*2],qc[maxn],ans[maxn];
int fi1[maxn],ne1[maxn*8],dui1[maxn*4],dui2[maxn*8],qc1[maxn];
int de[maxn],f[maxn][20],root[maxn];
int d[maxn];
int i,j,k,l,m,n,x,y,z,now,la,now1,p,o;
void add(int x,int y){
if (fi[x]==0) fi[x]=++now; else ne[qc[x]]=++now;