通过dfs序 将 上下级关系树 转换成线性结构, (转换成线性结构 便于 上级 和下级一起更新)
然后构建线段树, 进行修改查询。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+50;
int dfs[maxn]; // dfs序数组
vector<int>G[maxn];//图
int st[maxn];//i 子树在dfs序中开始的位置
int ed[maxn];// i 子树 结束的位置
int len;//dfs数组的长度
int tim;// 时间
int pos[maxn]; // i在dfs序中的位置
bool d[maxn];// 标记是否有入度
struct node
{
int l;
int r;
int lazy;
int work;
}Segtr[maxn*4];
void DFS(int x, int l)
{
dfs[++len] = x;
st[x] = ++tim;
pos[x] = len;
for(int i = 0;i < (int)G[x].size();i++)
{
DFS(G[x][i],x);
}
ed[x] = tim;
}
void build(int rt, int l, int r)
{