問題の説明
リンゴの木はカカーの家の外にあります。毎年秋には、りんごの多くは木に成長します。カカは非常に多くのリンゴを好きなので、彼は慎重に大きなリンゴの木を育ててきました。
ツリーはありNの枝で接続されているフォークを。カカ番号に1によるフォークNと根が常に1りんごによって番号が付けられてはフォークの上に成長すると2個のりんごは同じフォーク上に成長しません。カカはリンゴの木の生産能力の彼の研究のために、サブツリーにありますどのように多くのリンゴ知りたいです。
トラブルは、新しいリンゴが空のフォークにいくつかの時間を育てることとカカーは彼のデザートに木からリンゴを選ぶかもしれないということです。あなたはカカーを助けることができますか?
入力
最初の行は、整数含まN(Nツリー内のフォークの数であり、100,000以下)、。
次のN - 1行それぞれは、2つの整数含むU及びVフォーク意味し、U及びフォークVが分岐によって接続されています。
次の行は、整数含まM(M ≤100,000)。
次のM個の行それぞれのいずれかであるメッセージ含有
「CのXフォークアップルの存在を意味し、」Xを変更されました。フォーク上のリンゴがある場合、すなわち、その後、カカはそれを選びます。そうでない場合は、新たなリンゴが空のフォークに成長してきました。
又は
「QのXフォーク上記サブツリー内のリンゴの数の問い合わせを意味し、」XをフォークX上のりんごを含むが、(存在する場合)
ツリーは冒頭にりんごのいっぱいであることに注意してください
出力
すべてのお問い合わせについては、出力行あたりの対応の答え。
サンプル入力
3 1 2 1 3 3 Q 1つのC 2 Q 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 使用 名前空間STDを、 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は、<G [S] .size(); ++ IT) 44 { 45 DFS(G [S] [それ])。 46 } 47 エンド[S] = ++ nCount。 48 } 49 50 のint main()の 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 "、&、&B); 59 G [A] .push_back(B)。 60 } 61 nCount = 0 。 62の DFS(1 )。 63 のために(i = 1 ; I <= nCount; I ++ ) 64 lowbit [I] = I・(I ^(I- 1 ))。 65 のために(i = 1 ; I <= nCount I ++)// 求C []数组 66 C [I] = I-(I-lowbit [I] + 1)+ 1 。 67 のために(i = 1 ; iが<= N; iが++ ) 68 { 69 HasApple [I] =1 ; 70 } 71 のscanf(" %dの"、&M)。 72 のために(i = 0 ; iがm <; iは++ ) 73 { 74の チャー CMD [ 10 ]。 75 のint ; 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個の\ n "、(T1-T2)/ 2 + HasApple [A])。 97 } 98 } 99 } 100 }
ます。https://www.cnblogs.com/sdau--codeants/p/3484874.htmlで再現