#include #include #include #include using namespace std; const int MAXN = 100010; int spos[MAXN],epos[MAXN],sum[MAXN],w[MAXN]; int n,f[MAXN],index; bool vis[MAXN]; struct edge { int u,v,w; edge(int a=0,int b=0,int c=0):u(a),v(b),w(c){} bool friend operator<(const edge a,const edge b) { return a.w Q; vector g[MAXN]; void init() { for(int i=0;i<=n;i++) { f[i]=i; w[i]=sum[i]=0; g[i].clear(); } } int find(int x) { if(x==f[x]) return f[x]; f[x]=find(f[x]); return f[x]; } void Union(int x,int y) { int a=find(x); int b=find(y); if(a==b) return ; f[a]=b; g[x].push_back(y); g[y].push_back(x); } void Kruskal() { while(!Q.empty()) { Union(Q.top().u,Q.top().v); Q.pop(); } } int lowbit(int x) { return x&(-x); } void modify(int x,int add) { while(x<=n) { sum[x]+=add; x+=lowbit(x); } } int get_sum(int x) { int ret=0; while(x!=0) { ret+=sum[x]; x-=lowbit(x); } return ret; } void dfs(int u) { spos[u]=index; vis[u]=true; for(int i=0;i