// 树链剖分+树状数组
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int to[maxn*2],nex[maxn*2],w[maxn*2],beg[maxn];
struct edege{
int e1,e2;}e[maxn];
int no[maxn];
int a[maxn];
int fa[maxn],dis[maxn],size[maxn],son[maxn],top[maxn];
int id[maxn],rank[maxn];
int c[maxn];
int n,q,s,cnt,tot;
void add(int x,int y,int z){
to[++tot]=y;
nex[tot]=beg[x];
beg[x]=tot;
w[tot]=z;
}
void dfs1(int rt,int ba){
size[rt]=1; dis[rt]=dis[ba]+1;
for(int i=beg[rt] ; i ; i=nex[i]){
int u=to[i];
if(u!=ba){
a[u]=w[i];
fa[u]=rt; dfs1(u,rt);
size[rt]+=size[u];
if(size[u]>size[son[rt]])son[rt]=u;
}
}
}
void dfs2(int rt,int tp){
top[rt]=tp;
id[++cnt]=rt; rank[rt]=cnt;
if(son[rt])dfs2(son[rt],tp);
for(int i=beg[rt];i;i=nex[i]){
int u=to[i];
if(u!=son[rt] && u!=fa[rt])dfs2(u,u);
}
}
int lowbit(int x){
POJ 2763树剖+线段树+树状数组
于 2022-03-20 20:00:07 首次发布