传送门
边分治板题。。。
三度化即可。
代码:
#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
typedef pair<int,int> pii;
typedef long long ll;
const int N=200005,inf=0x3f3f3f3f;
int n,vl[N],m,all,rt,siz[N];
bool vis[N];
pii Rt;
int Len;
vector<int>e[N],Son[N];
vector<pii>g[N],pth[2];
ll ans=0;
void dfs(int p,int fa){
for(ri i=0,v;i<e[p].size();++i){
<