가장 중요한 부모 노드와 같은 노드의 수, 우리는 나무이 기록 노드와 그가 시작 끝 노드를 DFS있는 수요가 있었다 전에 DFS 두 지점 사이 일 정도로 길고,이 제목을 주문입니다 라인에 DFS
첫째, 트리 구조를 저해하지 않고, 둘째, 그는 또한 상기 해당 펜윅 트리 매우 일반적인 기술이다 각 노드 간의 상대적인 관계
당신은 g ++ 사용하려는 경우 Benpian 유료로 C ++ 코드를 요구, 필요 특히 평가 시스템을 POJ마다 급여의 문제, 최고의 C ++ 크로스, 어쨌든, 나는 특정 원리를 모르는, 벡터 포맷을 약간 변경합니다.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
사용법 #include <iostream> #INCLUDE <알고리즘> #INCLUDE <cstdio> #INCLUDE <cmath> #INCLUDE <벡터> #INCLUDE < 문자열 > #INCLUDE <CString을> #INCLUDE <지도> #INCLUDE < 세트 > 사용 스페이스 성병; 형식 정의를 오래 오래 LL; CONST INT N = + 1E5 (10) ; CONST INT INF = 0x3f3f3f3f ; INT 세인트 [N]; INT의 ED [N]; INT TR [N]; INT 힘 [N]; 벡터 < INT > MA [N]; INT N; INT IDX; 보이드 DFS ( INT U) { IDX ++ ; 세인트 [U] = IDX; 위한 ( INT 난 = 0 ; I <MA [U] 크기는 ()을, 난 ++ ) { DFS (MA [U] [I]); } ED [U] = IDX; } INT lowbit ( INT X) { 복귀 , X - X; } 보이드 추가 ( INT의 X, INT c) { int로 난을; 대 (X = I, I <= N; I + = lowbit (I)) { TR [I] + = C; } } INT 합 ( INT X) { INT I; INT 입술 = 0 ; 대 (X = I, I, I- = lowbit (I)) { 아무것도 + = TR [I]; } 반환 입술을; } int로 주 () { 지능 I; CIN >> N; 대해 (ⅰ = 1 ; 나는 <N; I ++ ) { INT U, V는; scanf와 ( " % D % D ' , U, 및 V); MA [U] .push_back (V); } DFS ( 1 ); 대해 (ⅰ = 1 ; 나는 <= N; 나는 ++ ) { (세인트을 [I], 추가 1 ); 뷰 [I] = 1 ; } INT m; CIN >> m; 반면 (M-- ) { 문자 S [N]; scanf와 ( " %들 " , S); 경우 (S == * ' C ' ) { INT (X); scanf와 ( " %의 D ' , X); 만약 VIS ([X]) { 추가 (세인트 [X] - 1 ); AM [X] = 0 ; } 다른 { 추가 (세인트 [X], 1 ); AM [X] = 1 ; } } 다른 { INT X; scanf와 ( " %의 D ' , X); 의 printf ( " 가 % d \ n " , SUM (ED [X]) - 합 (세인트 [X] - 1 )); } } }