dfs序是将树形结构转换为线性结构的一种方式。
dfs序
 dfs序: 指每个节点在dfs深度优先遍历中的进出栈的时间序列。
 定义三个数组:
 in[x]:表示结点x 入栈的时间戳。
 out[x]:表示结点x出栈的时间戳,特殊的,出栈不算时间。
 id[x]:表示结点x在新的线性序列中的下标, id[x]=in[x]。

 dfs访问顺序为:A,B,E,F,K,C,G,H,I
 则结点的入栈出栈时间如下:
 
 这样,我们得到一个新的线性序列:
 A,B,E,F,K,C,G,H,I
 通过观察可以发现,以x 为根的子树在一个连续的区间,即在x 入栈和出栈之间,因此,如果要对子树进行操作,可以看作对一个区间进行操作,且这个区间对应新的线性序列中的in[x] out[x]。
支持两种操作:
 单个结点修改
 对单个结点x进行修改,则对应新的线性序列对id[x]进行修改。
 对x为根的子树进行修改
 如对结点B根的子树进行操作,则对应线性序列区间in[B] out[B],即区间[2,5]进行操作。
void dfs(int u)
{
    inn[u]=++num;	//入栈时间
    s[u]=num;	//新的线性序列 
    vis[u]=1;
    for(int i=first[u];i!=-1;i=nex[i])
    {
        int v=to[i];
        if(!vis[v]) dfs(v);
    }
    outt[u]=num;	//出栈时间,不计算时间
}



















