문제 설명
카카의 집의 사과 나무 외부가있다. 모든 가을, 사과의 많은 나무에 성장할 것입니다. 카카는 매우 사과를 좋아하는, 그래서 그는 조심스럽게 큰 사과 나무를 육성하고있다.
나무는이 N의 나뭇 가지로 연결되어 포크. 1로 포크 카카 번호 N 루트는 항상 1. 사과로 번호가 매겨진는 포크에 성장하고 두 개의 사과 같은 포크에 성장하지 않습니다. 카카는 사과 나무의 생산 능력을 자신의 연구를 위해, 하위 트리에 얼마나 많은 사과 알고 싶어.
문제는 새로운 사과가 빈 포크에 시간이 성장할 수 있으며, 카카는 자신의 디저트 나무에서 사과를 선택할 수 있다는 것이다. 당신은 카카 도와 드릴까요?
입력
첫 번째 라인은 포함 정수 N ( N 트리 포크의 개수 ≤ 100,000)를.
다음 N - 1 개 라인마다 두 포함 정수 U를 하고 V를 포크 즉, U 및 포크 (V)가 분기하여 연결되어있다.
다음 줄은 정수가 들어 M ( M ≤ 100,000).
다음 M의 라인은 각각 하나 인 메시지에 포함
" C의 X 포크에 사과의 존재를 의미한다" X를변경되었습니다. 포크에 사과가있는 경우 즉, 다음 카카를 선택; 그렇지 않으면 새로운 사과는 빈 포크에 성장했다.
또는
" Q의 X 포크 상기 서브 트리 사과의 개수에 대한 문의 수단" X 포크 X를 (존재하는 경우)을 포함 사과,
트리 주 처음에 사과 가득
산출
모든 문의를 들어, 출력 라인 당 대응 대답.
샘플 입력
1 2 3 3 3 1 1 Q Q C 2 1
샘플 출력
3 2
************************************************** ************************************************** ******************************
가장 중요한 것은 기록 펜윅 나무의 타임 스탬프입니다
************************************************** ************************************************** ******************************
1 / * 2 有时间戳的树状数组, 3 * / 4 #INCLUDE <iostream> 5 #INCLUDE < 문자열 > 6 #INCLUDE <CString을> 7 #INCLUDE <cmath> 8 #INCLUDE <큐> 9 #INCLUDE <cstdio > 10 #INCLUDE <지도> 11 #INCLUDE <알고리즘> 12 이용한 스페이스 성병; 13 #DEFINE maxn 220000 14 의 typedef 벡터 < INT > VCT_INT; 15 벡터 <VCT_INT> G (maxn / 2 ); nCount, N-, m] . 17 INT 시작 [MAXN 같이, 끝 [MAXN] 18는 INT ] C [MAXN], [MAXN] lowbit . 19 INT의 HasApple [MAXN / 2 ] 20 INT query_sum ( INT P) // 찾아내는 상기 내부 섹션 (21)은 { 22는 INT의 SUM = 0 ] (23)이 그동안 (P> 0 ) 24 { 25 SUM + = ] C [P] 26 인 P- = lowbit [P] 27 } 28 리턴 SUM; 29 } (30) (31)는 공극 수정 ( INT의 P, int로 발을) // 삽입 업데이트 32 { 33은 그동안 (P는 <= nCount) (34)는 { 35 C [P] + = 브로; 36 P + = lowbit [P] 37 } 38이다 } 39 40 보이드 DFS ( INT의 S) // 삽입 스탬프 (41)는 { (42)가 시작 [S] = ++ nCount; 43이다 위해 ( int로 IT가 = 0 ; IT <G [S] 크기는 (); ++ IT를) 44 { 45 DFS (G [S] [그]); 46 } 47 최종 [S] = ++ nCount; 48 } 49 50 INT 주 () 51 { 52 INT의 I, J, K; 53 동안 (는 scanf ( " %의 D ' , N)! = EOF) 54 { 55 INT의 A, B, C; 56 대 (I = 1 ; i가 N이 <I ++ ) 57 { 58 는 scanf ( " % d 개 %의 D ' , A, 및비); 59 G [A] .push_back (b); 60 } 61 nCount = 0 ; 62 DFS ( 1 ); 63 대 (I = 1 ; I <= nCount; I ++ ) 64 lowbit [I] = 1 및 (I ^ (I- 1 )); 65 대 (I = 1 ; I <= nCount I ++) // 求C []数组 66 C [I] = I- (I-lowbit [I] + 1 ) + 1 ; (67) 에 대한이 (I = 1 난 ++; 나는 <= N ) 68 { 69 [I] = HasApple을1 ; 70 } 71 는 scanf ( " %의 D ' , m); 72 대 (I = 0 ; I <m은, 내가 ++ ) 73 { 74 명 숯 을 cmd [ 10 ]; 75 INT a 및 76 는 scanf ( " % S %의 D " (CMD), & A ); (77) 만약 CMD ([ 0 ] == ' C ' ) 78 { 79 의 경우 (HasApple [A]) 80 { 81 수정 (시작 [A] - 1 ); 82 수정 (끝 [A] - 1 ); 83 HasApple [A] = 0 ; 84 } 85 또 86 { 87 수정 (시작 [A], 1 ); 88 수정 (최종 [A], 1 ); 89 HasApple [A] = 1 ; 90 } 91 } 92 또 93 { 94 INTT1 = query_sum (최종 [A]); 95 INT의 T2 = query_sum (시작 [A]); 96 의 printf ( " % D \ 없음 " , (T1-T2) / 2 + HasApple [A]); 97 } 98 } 99 } 100 }
HTTPS : //www.cnblogs.com/sdau--codeants/p/3484874.html 재현