Description Lake by the N-gate (2≤n≤100,000, numbering from 1 to n) composed of the N-1 between these gates to connect them together, each road to "ruler" for the unit to measure, the martial arts leader found any two of the door can be directly or indirectly through the path connection 。 
Although the whole river is able to reach each other, but he feared that there is a bad man to destroy the stability of the martial arts, destruction of the path, so the martial arts leader and secretly built M Secret Road (1≤m≤100,000), but each path is not more than 1 billion feet away. 
Sure enough, a recently called "Too my" organization intends to destroy the path of the martial arts, please help the chief to think of ways, if the door send a to the gate B straight Path is destroyed, from A to B all the way, through the secret path of the least how much? 
     input first row number N M 
Next N-1 line, two integers a B per line, indicates a straight path between a-a 
The next M line, three digits a B V per line, indicates  that a A-V channel    output N-1 line, corresponding to the original input path, each path is destroyed, the minimum need to go through how long Secret road? If there are no alternative roads, output-1 
     Sample Input 
6 34 11 34 51 26 53 6 82 3 76 4 5
     Sample Output 
87575
     Data constraint30%: n<=300,m<=1000 
50% Data: n<=1000,m<=1000 
70% Data: n<=5000,m<=5000 
For another 15% data points: The tree is a chain 
100% Data: n,m<=100,000  
Analysis
The problem is clearly the value of the edge that passes through the two ends of the secret path to the LCA.
It's not just a tree-chain split.
Write a range change and leave
What the? And check the set of practices? No
#include <iostream>#include<cstdio>#include<cstring>#defineRep (i,a,b) for (i=a;i<=b;i++)using namespacestd;Const intn=1e5+Ten;structNode {intSZ,F,S,SEG,TOP,DEP;} A[n];intScnt,rev[n];structEdge {intU,v,nx;} g[2*N];intCnt,list[n];intt[4*n],lz[4*N];intmn;intn,m;voidADD (intUintV) {g[++cnt].u=u;g[cnt].v=v;g[cnt].nx=list[u];list[u]=CNT;}voidDFS1 (intXintf) {a[x].f=f;a[x].dep=a[f].dep+1; a[x].sz=1;  for(intI=list[x];i;i=g[i].nx)if(g[i].v!=f) {DFS1 (g[i].v,x); A[x].sz+=A[g[i].v].sz; if(A[G[I].V].SZ>A[A[X].S].SZ) a[x].s=g[i].v; }}voidDFS2 (intXintf) {intson=A[x].s; if(son) {a[son].seg=++scnt; REV[SCNT]=Son; A[son].top=A[x].top;    DFS2 (SON,X); }     for(intI=list[x];i;i=g[i].nx)if(!a[g[i].v].top) {a[g[i].v].seg=++scnt; REV[SCNT]=g[i].v; A[g[i].v].top=g[i].v;    DFS2 (G[I].V,X); }}voidBuild (intXintLintr) {if(l==R) {T[x]=2147483647; return; }    intMid=l+r>>1; Build (x<<1, L,mid); Build ((x<<1)+1, mid+1, R); T[X]=2147483647;}voidPushdown (intx) {if(Lz[x]) {t[x<<1]=lz[x<<1]=min (!lz[x<<1]?2147483647:lz[x<<1],lz[x]); t[(x<<1)+1]=lz[(x<<1)+1]=min (!lz[(x<<1)+1]?2147483647: lz[(x<<1)+1],lz[x]); LZ[X]=0; }}voidChange_in_segment (intXintLintRintValintllintRR) {    if(LL>RR)return; if(l>rr| | LL>R)return; if(ll<=l&&r<=RR) {T[x]=min (t[x],val); LZ[X]=min (!lz[x]?2147483647: Lz[x],val); return;    } pushdown (x); intMid=l+r>>1; if(MID>=LL) Change_in_segment (x<<1, L,MID,VAL,LL,RR); if(MID<RR) Change_in_segment ((x<<1)+1, mid+1, R,VAL,LL,RR); T[X]=min (t[x<<1],t[(x<<1)+1]);}voidQuery_in_segment (intXintLintRintllintRR) {    if(LL>RR)return; if(r<ll| | L>RR)return; if(ll<=l&&r<=RR) {MN=min (mn,t[x]); return;    } pushdown (x); intMid=l+r>>1; if(Ll<=mid) Query_in_segment (x<<1, L,MID,LL,RR); if(mid+1<=RR) query_in_segment ((x<<1)+1, mid+1, R,LL,RR);}voidQuery_in_tree (intXinty) {intfx=a[x].top,fy=A[y].top;  while(fx!=FY) {        if(a[fx].dep<a[fy].dep) Swap (x, y), swap (FX,FY); Query_in_segment (1,1, scnt,a[fx].seg,a[x].seg); X=a[fx].f;fx=A[x].top; }    if(a[x].dep>a[y].dep) Swap (x, y); Query_in_segment (1,1, scnt,a[x].seg+1, a[y].seg);}voidChange_in_tree (intXintYintval) {    intfx=a[x].top,fy=A[y].top;  while(fx!=FY) {        if(a[fx].dep<a[fy].dep) Swap (x, y), swap (FX,FY); Change_in_segment (1,1, scnt,val,a[fx].seg,a[x].seg); X=a[fx].f;fx=A[x].top; }    if(a[x].dep>a[y].dep) Swap (x, y); Change_in_segment (1,1, scnt,val,a[x].seg+1, a[y].seg);}intMain () {Freopen ("worry.in","R", stdin); Freopen ("Worry.out","W", stdout); inti; Chars[ -]; scanf ("%d%d",&n,&m); Rep (I,1, N-1) {        intu,v; scanf ("%d%d",&u,&v); ADD (U,V);    ADD (V,u); } DFS1 (1,0); SCNT=1; a[1].seg=a[1].top=rev[1]=1; DFS2 (1,0); Build (1,1, SCNT);  for(intI=1; i<=m;i++) {        intx,y,w; scanf ("%d%d%d",&x,&y,&W);    Change_in_tree (X,Y,W); }     for(intI=1; i<=n-1; i++) {mn=2147483647; Query_in_tree (G[i*2-1].u,g[i*2-1].v); printf ("%d\n", mn==2147483647?-1: MN); }}View Code
[Tree chain split] Jzoj 5914 chief's worries