敵の兵士のラインナップ
制限時間:1000分の2000 MS(Javaの/その他)メモリの制限:32768分の65536 K(Javaの/その他)の合計提出(S):147556受理提出(S):61126
問題の説明
ライバル国C国の継続的な軍事演習、この時間は、国のスパイチーフCデレクと彼の男性は忙しいのTidyまで始めました。Nエンジニアリングキャンプのラインに沿って配置された国の海岸線は、デレクとTidyのタスクは、これらのエンジニアキャンプの活動を監視することです。高度な監視ツールのいくつかの種類なので、各陣営のCクリスタルクリアな把握米国でのエンジニアの数の結果として、各陣営における技術者の数は、変更を発生する可能性がある職員の数を増減することがありますが、それらはCを免れることはできません国を監視します。
「Tidyの、すぐに10の陣営の合計の多くの人々に最初の3つのキャンプを報告:デレクTidyのレポートにどのように多くの人の合計を連続エンジニアリングキャンプの一定期間を維持するように、デレクは尋ねたなど、まさに練習敵の戦術を研究するためにCIA !「Tidyのは、すぐにこの項及び報告書の合計数を計算するために開始されます。しかし、デレクはTidyの速度を計算するために敵のキャンプの数は頻繁に変更し、デレクは、各セグメントは、Tidyのはキャンプ、すぐに枯渇の数に行かなければならなかったので、毎回違う尋ねますます不満:Tidyの思想「!死んだ脂肪の少年あなた、とても遅いと考え、私はあなたを解雇」:「あなたは数学を自分で行う、本当に私はあなたがあまりにも私を解雇たい疲れる仕事です! 「絶望では、Tidyのは、ウインドブレーカー、ウインドブレーカーを支援するために、コンピュータの専門家を呼び出すためにと言いました:」!死んだ脂肪少年、あなたは通常、マルチポイントACMタイトルと呼ばれ、マルチ小数点演算ブックを参照してくださいか、今の苦い実を味わった「Tidyのは、言いました:」私は...ミスを認め「が、ウインドブレーカーは、電話を切りました。Tidyの非常に動揺し、彼は本当に、インテリジェントな読者をクラッシュをカウントしますので、あなたは彼が仕事を終える支援するプログラムを書くことができますか?あなたのプログラムの効率が十分に高くない場合でも、Tidyのはまだデレクさん叱られます。
入力
データの最初の行の整数T、Tセットが発現しました。
各正の整数N(N <= 50000)の最初の行のデータ、Nは、敵キャンプエンジニア、Nと次の正の整数を表し、iはi番目のAI開始エンジニアリングキャンプを表す正の整数をaiを有するあります個人(1 <= AI <= 50 )。
:次に、コマンドを有する各列は、コマンドは、4つの形式があり
(1)、追加のijは、iは、jは正の整数でキャンプ増加個人jのi番目(jは30以下である)である
、(2)サブIJをiとjそれは、正の整数である(jは30を超えていない)は、i番目のキャンプは、Jの個人を減らす表し;
の(3)クエリIJ、i、jは正の整数であり、私は= J <、j番目のキャンプにi番目の総数を求めるために提示します。
(4)の端部は、データの各セットに表示される最後のコマンドが終了を示し、
各データコマンド最大40,000
出力
データのi番目のグループ、第一の出力は「ケースI:」および、入力
各クエリのクエリ、キャリッジリターンと出力用セグメント内のクエリの総数を表す整数を、この数はINT内に留まります。
サンプル入力
1 10 1 2 3 4 5 6 7 8 9 10 クエリ1 3 3 6は、追加 クエリ2~7 のSub 10 2 6 3追加 クエリ3 10 終了
サンプル出力
ケース1: 6 33 59
この問題は、トリッキーなものではありませんツリー状の配列テンプレートのタイトルで、完全にフェンウィックツリーを理解し、この質問は難しいことではありません。
コードは以下の通りであります:
#include <iostreamの> する#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <cstdioを> の#define MAXN 50010 使用して 名前空間STD; int型N-; INTツリー[MAXN * 2 ]、NUM [MAXN]; INT lowbitは(int型X){ 返す X&( - X); } 無効に追加(int型の Xを、int型P){ しばらく(X <= N-){// ここに私は非常に低レベルの誤りを犯した。しばらくは、以下の場合に書かれて、結果があったWA ツリー[X] + = P。 X + = lowbit(X)。 } を返します。 } ボイドサブ(int型のx、int型P){ 一方(X <= N){ ツリー[X] - = P。 X + = lowbit(X)。 } を返します。 } int型の和(INT X){ int型 ANS = 0 。 一方、(X> 0 ){ ANS + = ツリー[X]。 X - = lowbit(X)。 } リターンANS; } INTクエリ(int型 L、INT R){ 戻り和(R)-sum(1- 1 )。 } int型のmain(){ int型の T、I、J、K、S = 1 。 文字列strの。 cinを >> トン。 一方、(t-- ){ CIN >> N。 memset(NUM、0、はsizeof (NUM))。 memset(木、0、はsizeof (木))。 ため(K = 1 ; K <= N ++ kは{) scanf関数を(" %のD "、&NUM [K])。 追加(K、NUM [K])。 } のprintf(" ケース%のD:\ n " 、S); S ++ ; しばらく((CIN >> STR)&&(STR =!" 終了" )){ scanf関数(" %d個の%d個"、&I&J)。 もし(STR [ 0 ] == ' Q ' ){ のprintf(" %d個の\ n " 、クエリ(I、J))。 もし0 ] == ' A ' ){ NUM [I] + = J。 (i、j)を追加します。 } そう であれば(STR [ 0 ] == ' S ' ){ NUM [I] - = J。 サブ(i、j)は、 } } } 戻り 0 。 }