UESTC summer training A 【树链剖分 模板】

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
void read(int& x)
{
	x = 0;
	char c = getchar();
	int flag = 1;
	while(c<'0'||c>'9')
	{
		c = getchar();
		if(c=='-')flag = -1;
	}
	while(c>='0'&&c<='9')
	{
		x = x*10+c-'0';
		c = getchar();
	}
	x*=flag;
}
#define maxn 100010
int n,q;
int nowedge = 1;
struct edge{
	int v,next;
}e[maxn<<1];
int head[maxn];
void adde(int u,int v)
{
	e[nowedge].v = v;
	e[nowedge].next = head[u];
	head[u] = nowedge++;
}
ll w[maxn];
int son[maxn];
int fa[maxn];
int top[maxn];
int tid[maxn],tim;
int dep[maxn];
int rank[maxn];
int size[maxn];
void dfs1(int u,int father,int d)
{
	dep[u] = d;
	size[u] = 1;
	fa[u] = father;
	for(int i=head[u];~i;i=e[i].next)
	{
		int v = e[i].v;
		if(v!=father)
		{
			dfs1(v,u,d+1);
			size[u]+=size[v];
			if(son[u]==-1||size[son[u]]

你可能感兴趣的:(算法与数学)