Chain water problem.
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#defineMAXV 100500#defineMaxe 200500#defineINF 2147483647using namespacestd;intN,m,type,x,y,z,val[maxv],id=1, g[maxv],nume=0;intw[maxv],fw[maxv],dis[maxv],fath[maxv],top[maxv],size[maxv],son[maxv],mx[maxv],times=0;introot,tot=0,ls[maxv<<2],rs[maxv<<2],mn[maxv<<2],lazy[maxv<<2];structedge{intV,NXT;} E[maxe];voidAddedge (intUintv) {e[++nume].v=v; E[NUME].NXT=G[u]; G[u]=Nume;}voidDFS1 (intXintfather) {Size[x]=1; son[x]=0; for(intI=g[x];i;i=e[i].nxt) { intv=e[i].v; if(v!=father) {Fath[v]=x;dis[v]=dis[x]+1; DFS1 (V,X); SIZE[X]+=Size[v]; if(Size[v]>size[son[x]]) son[x]=v; } }}voidDFS2 (intXintfather) {W[x]=mx[x]=++times;fw[times]=x;top[x]=father; if(Son[x]) {DFS2 (son[x],father); mx[x]=Max (mx[x],mx[son[x]);} for(intI=g[x];i;i=e[i].nxt) { intv=e[i].v; if((V!=fath[x]) && (v!=Son[x])) {DFS2 (v,v); MX[X]=Max (Mx[x],mx[v]); } }}voidBuildint&now,intLeftintRight ) { Now=++tot;lazy[now]=inf; if(left==Right ) {Mn[now]=Val[fw[left]]; return; } intMid=left+right>>1; Build (Ls[now],left,mid); Build (Rs[now],mid+1, right); Mn[now]=min (Mn[ls[now]],mn[rs[now]]);}voidPushdown (intNow ) { if(Lazy[now]==inf)return; Lazy[ls[now]]=lazy[rs[now]]=mn[ls[now]]=mn[rs[now]]=Lazy[now]; Lazy[now]=inf;}voidModifyintNowintLeftintRightintLintRintx) {pushdown (now); if((left==l) && (right==r)) {Lazy[now]=x;mn[now]=x; return; } intMid=left+right>>1; if(r<=mid) Modify (LS[NOW],LEFT,MID,L,R,X); Else if(l>=mid+1) Modify (rs[now],mid+1, right,l,r,x); Else{Modify (ls[now],left,mid,l,mid,x); Modify (Rs[now],mid+1, right,mid+1, r,x); } Mn[now]=min (Mn[ls[now]],mn[rs[now]]);}voidline_modify () {intF1=top[x],f2=Top[y]; while(f1!=F2) { if(dis[f1]<Dis[f2]) {swap (F1,F2); swap (x, y);} Modify (Root,1, n,w[f1],w[x],z); X=fath[f1];f1=Top[x]; } if(dis[x]>Dis[y]) swap (x, y); Modify (Root,1, n,w[x],w[y],z);}intLcaintXinty) { intF1=top[x],f2=Top[y]; while(f1!=F2) { if(dis[f1]<Dis[f2]) {swap (F1,F2); swap (x, y);} X=fath[f1];f1=Top[x]; } if(Dis[x]<dis[y])returnx; returny;}intLCA2 (intXintPOS) { intF1=top[x],f2=Top[pos],ret; while(F1!=F2) {ret=f1;x=fath[f1];f1=top[x];} if(X==pos)returnret; Else returnSon[pos];}intAskintNowintLeftintRightintLintR) { if(L>r)returninf; Pushdown (now); if((left==l) && (right==R))returnMn[now]; intMid=left+right>>1; if(R<=mid)returnAsk (LS[NOW],LEFT,MID,L,R); Else if(l>=mid+1)returnAsk (rs[now],mid+1, Right,l,r); Else returnMin (Ask (Ls[now],left,mid,l,mid), Ask (rs[now],mid+1, right,mid+1, R));}voidLine_ask () {intt=LCA (ID,X); if(id==x) printf ("%d\n", Ask (Root,1N1, N)); Else if(t==x) {intpos=LCA2 (id,x); intl=w[pos]-1, r=mx[pos]+1; printf ("%d\n", Min (Ask (Root,1N1, l), ask (Root,1, N,r,n))); } Elseprintf ("%d\n", Ask (Root,1, n,w[x],mx[x]));}intMain () {scanf ("%d%d",&n,&m); for(intI=1; i<=n-1; i++) {scanf ("%d%d",&x,&y); Addedge (x, y); Addedge (y,x); } for(intI=1; i<=n;i++) scanf ("%d",&Val[i]); scanf ("%d",&ID); DFS1 (1,1); DFS2 (1,1); Build (Root,1, N); for(intI=1; i<=m;i++) {scanf ("%d",&type); if(type==1) scanf ("%d",&ID); Else if(type==2) {scanf ("%d%d%d",&x,&y,&z); Line_modify (); } Else{scanf ("%d",&x); Line_ask (); } } return 0;}
Bzoj 3083 faraway lands.